Объектно-ориентированное программирование: различия между версиями

Содержимое удалено Содержимое добавлено
→‎Деструкторы и финализация: добавлено о Java и Си++
Строка 313:
=== RTTI ===
 
Свойство: В строго типизованных ОО языках компилятор осуществляет весь контроль типов, так что нет особой необходимости хранить информацию о классах и типах в работающей программе. Тем не менее, есть случаи (как, например, динамическое преобразование типов), которые требуют некоторую информацию о типе. По этой причине все три ОО языка, которые мырассматриваемые изучаемздесь, более или менее поддерживают Идентификацию/Информацию о Типе Времени Выполнения (RTTI).
 
'''C++: Язык C++''' первоначально не поддерживал RTTI. Это было добавлено позже для динамического преобразования типа (dynamic_cast) и сделало доступной некоторую информацию о типе для классов. Вы можете запросить идентификацию типа для объекта, и проверить, принадлежат ли два объекта одному классу.
 
'''OP: Object Pascal и визуальная среда''' поддерживает и требует много RTTI. Доступен не только контроль соответствия и динамическое преобразование типов (с помощью операторов ''is'' и ''as''). Классы генерируют расширенную RTTI для своих ''published'' свойств, методов и полей. Фактически это ключевое слово управляет частью генерации RTTI. Вся идея свойств, механизм потоков (файлы форм — DFM), и среда Delphi, начиная с Инспектора Объектов, сильно опирается на RTTI классов. У класса ''TObject'' есть (кроме прочих) методы ''ClassName'' и ''ClassType''. ''ClassType'' возвращает переменную типа класса, объект специального типа ссылки на класс (который не является самим классом).
 
'''Java:''' Каккак и в Object Pascal, в Java тоже есть единый базовый класс, помогающий следить за информацией о классе. Безопасное преобразование типов (type-safe downcast) встроено в этот язык. Метод ''getClass()'' возвращает своего рода метакласс (объект класса, описывающего классы), и Вы можете применить функцию ''getName()'' для того, чтобы получить строку с именем класса. Вы можете также использовать оператор ''instanceof''. Java включает в себя расширенную RTTI для классов или интроспекцию, которая была введена для поддержки компонентной модели JavaBeans. В Java существует возможность создавать классы во время исполнения программы.
 
Пример: Вот синтаксис безопасного преобразования типов на всех трех языках. В случае ошибки в Delphi и Java происходит исключение, а в С++ возвращается нулевой указатель:
 
Пример: Вот синтаксис безопасного преобразования типов на трех языках. В случае ошибки в Delphi и Java происходит исключение, а в С++ возвращается нулевой указатель:
// C++
Dog* MyDog = dynamic_cast <Dog*> (myAnimal);