Читаем Философия Java3 полностью

В языке С++ классическая форма типа «(Shape)» вообще не задействует RTTI. Она просто сообщает компилятору, что необходимо обращаться с объектом как с новым типом. В языке Java, который при приведении проверяет соответствие типов, такое преобразование часто называют «безопасным нисходящим приведением типов». Слово «нисходящее» используется в силу традиций, сложившихся в практике составления диаграмм наследования. Если приведение окружности Circle к фигуре Shape является восходящим, то приведение фигуры Shape к окружности Circle является, соответственно, нисходящим. Поскольку компилятор знает, что Circle является частным случаем Shape, он позволяет использовать «восходящее» присваивание без явного преобразования типа. Тем не менее, получив некий объект Shape, компилятор не может быть уверен в том, что он получил: то ли действительно Shape, то ли один из производных типов (Circle, Square или Triangle). На стадии компиляции он видит только Shape и поэтому не позволит использовать «нисходящее» присваивание без явного преобразования типа.

Существует и третья форма RTTI в Java — ключевое слово instanceof, которое проверяет, является ли объект экземпляром заданного типа. Результат возвращается в логическом (boolean) формате, поэтому вы просто «задаете» вопрос в следующей форме:

if(x instanceof Dog) ((Dog)x).bark().

Команда if сначала проверяет, принадлежит ли объект х классу Dog, и только после этого выполняет приведение объекта к типу Dog. Настоятельно рекомендуется использовать ключевое слово instanceof перед проведением нисходящего преобразования, особенно при недостатке информации о точном типе объекта; иначе возникает опасность исключения ClassCastException.

Обычно проводится поиск одного определенного типа (например, поиск треугольников среди прочих фигур), но с помощью ключевого слова instanceof легко можно идентифицировать все типы объекта. Предположим, что у нас есть иерархия классов для описания домашних животных Pet (и их владельцев — эта особенность пригодится нам в более позднем примере). Каждое существо (Individual) в этой иерархии обладает идентификатором id и необязательным

именем. В данный момент код Individual нас не интересует — достаточно знать, что объект можно создавать с именем или без, и у каждого объекта Individual имеется метод id(), возвращающий уникальный идентификатор. Также имеется метод toString(); если имя не указано, toStringO выдает имя типа. Иерархия классов, производных от Individual:

// typeinfo/pets/Person.java package typeinfo.pets;

public class Person extends Individual {

public Person(String name) { super(name), } } III:-

//: typeinfo/pets/Pet.java package typeinfo pets;

public class Pet extends Individual {

public Pet(String name) { super(name), } public Pet О { superO. } } ///.-

//: typeinfo/pets/Dog.java package typeinfo.pets,

public class Dog extends Pet {

public Dog(String name) { super(name), } public Dog О { superO, } } Hill: typeinfo/pets/Mutt java package typeinfo pets;

public class Mutt extends Dog {

public Mutt(String name) { super(name); } public Mutt О { superO; } } ///.-

II: typeinfo/pets/Pug java package typeinfo pets;

public class Pug extends Dog {

public Pug(String name) { super(name); } public PugO { superO; } } Hill. typeinfo/pets/Cat java package typeinfo pets,

public class Cat extends Pet {

public Cat(String name) { super(name), } public CatO { superO, } } lll-

IH typeinfo/pets/EgyptianMau java package typeinfo.pets;

public class EgyptianMau extends Cat { продолжение &

public EgyptianMau(String name) { super(name); } public EgyptianMau() { superO; } } /// -

// typeinfo/pets/Manx java package typeinfo pets,

public class Manx extends Cat {

public Manx(String name) { super(name); } public ManxO { superO; }

} 111

II typeinfo/pets/Cymric java package typeinfo pets,

public class Cymric extends Manx {

public Cymric(String name) { super(name). } public CymricO { superO; } } III -

II. typeinfo/pets/Rodent java package typeinfo pets,

public class Rodent extends Pet {

public Rodent(String name) { super(name), } public RodentO { superO; } } III -

II' typeinfo/pets/Rat java package typeinfo pets,

public class Rat extends Rodent {

public Rat(String name) { super(name); } public RatO { superO; } } Hill' typeinfo/pets/Mouse java package typeinfo pets;

public class Mouse extends Rodent {

public Mouse(String name) { super(name); } public MouseO { superO, } } ///:-

II typeinfo/pets/Hamster java package typeinfo pets.

public class Hamster extends Rodent {

public Hamster(String name) { super(name); } public HamsterO { superO; } } ///:-

Затем нам понадобятся средства для создания случайных типов Pet, а для удобства — массивов и списков (List) с элементами Pet. Чтобы этот инструментарий мог «пережить» несколько разных реализаций, мы определим его в виде абстрактного класса:

// typeinfo/pets/PetCreator java // Создание случайных последовательностей Pet package typeinfo pets, import java util *,

public abstract class PetCreator {

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных