В языке С++ классическая форма типа «(Shape)» вообще
Существует и третья форма RTTI в Java — ключевое слово instanceof, которое проверяет, является ли объект экземпляром заданного типа. Результат возвращается в логическом (boolean) формате, поэтому вы просто «задаете» вопрос в следующей форме:
if(x instanceof Dog) ((Dog)x).bark().
Команда if сначала проверяет, принадлежит ли объект х классу Dog, и
Обычно проводится поиск одного определенного типа (например, поиск треугольников среди прочих фигур), но с помощью ключевого слова 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), }
//: 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, } }
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; } }
public class Cat extends Pet {
public Cat(String name) { super(name), } public CatO { superO, } }
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; }
}
II typeinfo/pets/Cymric java package typeinfo pets,
public class Cymric extends Manx {
public Cymric(String name) { super(name). } public CymricO { superO; }
II. typeinfo/pets/Rodent java package typeinfo pets,
public class Rodent extends Pet {
public Rodent(String name) { super(name), } public RodentO { superO; }
II' typeinfo/pets/Rat java package typeinfo pets,
public class Rat extends Rodent {
public Rat(String name) { super(name); } public RatO { superO; } }
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 {