Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Необходимость RTTI

Читайте также:
  1. В) Необходимость чудес: неподобие не есть небытие
  2. Вы осознаете необходимость осуществления личной оценки своих как сильных сторон, так и слабостей (дефектов характера).
  3. Г) Определяет необходимость замены крупье
  4. ГЛАВА 5. НЕОБХОДИМОСТЬ СОВЕРШЕНСТВОВАНИЯ ВНЕШНЕТОРГОВОГО РЕГУЛИРОВАНИЯ ПРОДОВОЛЬСТВЕННОГО РЫНКА РОССИИ
  5. ИГРА И НЕОБХОДИМОСТЬ
  6. Игра и необходимость
  7. Комм. 4. Про необходимость ограничений
  8. ЛЮБОВЬ К СЕБЕ - ЖИЗНЕННАЯ НЕОБХОДИМОСТЬ
  9. НЕОБХОДИМОСТЬ В НЕЗАВИСИМОСТИ

Рассмотрите пример иерархии классов, которые используют полиморфизм. Общий тип - это базовый класс Shape, и классы - наследники - Circle, Square и Triangle:

Это типичная диаграмма иерархии классов, с базовым классом на вершине и базовыми классами, растущими вниз. Стандартная задача в объектно-ориентированном программировании это манипуляции ссылкой на базовый тип (в нашем случае Shape) в больших объемах кода, так, что если Вы решите расширить программу за счет добавления нового класса (например,Rhomboid, наследуемый от Shape), больших изменений в коде не потребуется. В этом примере, методом динамического связывания в интерфейсе Shape является draw( ), так что цель клиентского программиста - вызывать метод draw( ) по ссылке на базовый класс Shape. Метод draw( ) перекрывается во всех наследуемых классах, и т.к. это динамически связанный метод, в результате все будет работать правильно, даже несмотря на то, что метод вызывается через ссылку на базовый класс Shape. И это - полиморфизм.

Итак Вы, в большинстве случаев, создаете объект (Circle, Square или Triangle), приводите его к базовому типу Shape (забывая об особенностях этого объекта), и используете эту анонимную ссылку наShapeв остальной части программы.

Вот краткий пример полиморфизма и приведения к базовому типу, показывающий то, что было описано выше:

//: c12:Shapes.javaimport java.util.*; class Shape { void draw() { System.out.println(this + ".draw()"); }} class Circle extends Shape { public String toString() { return "Circle"; }} class Square extends Shape { public String toString() { return "Square"; }} class Triangle extends Shape { public String toString() { return "Triangle"; }} public class Shapes { public static void main(String[] args) { ArrayList s = new ArrayList(); s.add(new Circle()); s.add(new Square()); s.add(new Triangle()); Iterator e = s.iterator(); while(e.hasNext()) ((Shape)e.next()).draw(); }} ///:~

Базовый класс содержит метод draw( ), который неявно использует toString( )для печати идентификатора класса подстановкой параметра this в функцию System.out.println( ). Если эта функция встречает объект, она автоматически вызывает метод toString( ), чтобы создать строковое представление объекта.

Каждый из наследуемых классов перекрывает метод toString( ) (из объекта Object) так, что draw( ) в любом случае печатает разные данные. В методе main( ), различные типы Shape создаются и добавляются в ArrayList. Именно в этом месте происходит приведение к базовому типу потому, что ArrayList хранит только объекты типа Object. Так как все в Java (за исключением примитивов) является типом Object, ArrayList может хранить также объекты типа Shape. Однако, при привведении к базовому типу Object,теряется специальная информация и то, что они имеют тип Shape. В ArrayList, они имеют тип Object.

В том месте, где Вы достаете элемент из ArrayList с помощью next( ), появляется небольшое оживление. Так как ArrayList хранит только тип Object, next( ) возвращает ссылку на тип Object. Но мы знаем, что, на самом деле, это ссылка на объект типа Shape, и хотим вызвать метод объекта Shape. Итак, нам необходимо приведение к типу Shape. Мы делаем это, используя стандартный метод приведения к типу: "(Shape)". Это - основная, базовая форма RTTI. Кроме того, в Java все приведения проверяются во время выполнения на корректность. Это в действительности и есть RTTI: идентификация типа объекта во время выполнения.

В этом случае, приведение RTTI является только частичным: тип Object приводится к типу Shape, но не приводится к Circle, Square или Triangle. Это происходит потому, что единственная вещь, которую мы хотим знать, это то, что ArrayList заполнен объектами типа Shape. Во время компиляции это реализуется по Вашему усмотрению, во время выполнения это обеспечивает механизм приведения типа.

Итак полиморфизм работает и нужный метод, вызываемый из Shape определяется в зависимости от того, является ли он ссылкой на Circle, Squareили Triangle. И вообще это так и должно быть; Вы хотите, чтобы основной Ваш код знал как можно меньше об особенностях объекта, и просто общался с основными представлениями группы объектов (в нашем случае Shape). В результате Ваш код будет проще читаться, писаться, исправляться, а Ваши намерения и планы будут проще в реализации, понимании и изменении. Итак, полиморфизм - основная задача объектно-ориентированного программирования.

Но если у Вас есть специальная задача, которая существенно упрощается, если Вы знаете точный тип базовой ссылки на объект? Например, представьте, что Вы хотите дать пользователям возможность подсвечивать все формы (Shape), определенного типа перекрашивая их в пурпурный цвет. В этом случае, они смогут найти все треугольники на экране, подсвечивая их. Это выполняет RTTI: Вы можете спросить у ссылки наShape точный тип объекта, на который она ссылается.

Загрузка...

Дата добавления: 2015-09-11; просмотров: 5 | Нарушение авторских прав

Типичное использование потоков ввода/вывода | Многофайловое хранение с использованием Zip | Сериализация объектов | Управление сериализацией | Ключевое слово transient | Альтернатива Externalizable | Использование устойчивости | StreamTokenizer | StringTokenizer | Проверка стиля капитализации |


lektsii.net - Лекции.Нет - 2014-2019 год. (0.008 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав