Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
0RBst7D3nn.doc
Скачиваний:
14
Добавлен:
30.04.2022
Размер:
694.78 Кб
Скачать

11.2. Полиморфизм

Термин полиморфизм образован от двух греческих слов: поли - много и морфе - форма. Полиморфизм позволяет создавать классы, которые будут вести себя по-разному в зависимости от того, подобъектом какого субкласса они являются. Иногда это называют наследованием наоборот.

Таким образом, наследование и полиморфизм связывает классы. Под статическим связыванием класса подразумевается техника наследования или агрегация, так как в этом случае поведение класса однозначно определено на момент компиляции и обеспечивается статический контроль типов. Динамическое связывание - это техника создания класса, поведение которого на момент компиляции не определено, поэтому используется динамический контроль типов.

Используя эти термины, можно определить ООП как программирование, ориентированное на использование классов в качестве основного механизма абстракции данных, причем классы могут иметь как динамическое, так и статическое связывание. Такое определение акцентирует внимание на понятии класса, при этом вопросы наследования и полиморфизма более тесно интегрируются с концепцией классов.

В С++ динамическое связывание классов осуществляется за счет виртуальных функций, а в Java - с помощью подменяющих методов.

Полиморфизм в Java.

Динамическое связывание в Java практически полностью соответствует аналогичному механизму в С++, за исключением того, что в Java не требуется явно объявлять функцию как виртуальную (в Java даже отсутствует такое ключевое слово). Это делает использование динамического связывания более простым и естественным. Сигнатуру метода определяют количество и тип формальных параметров, и тип возвращаемого значения.

Кроме того, в сигнатуру косвенно (по специальным правилам) входят модификатор доступа метода и список необрабатываемых исключительных ситуаций.

abstract class Shape {

void draw(int x, int y);

}

class Line {

void draw(int x, int y) {...}

}

class circle {

void draw(int x, int y) {...}

}

class Palette {

Shape getPalette() {

return new Line();

// return new Circle();

}

}

Shape shape = new Palette().getPalette();

shape.draw(x, y); // будет нарисована линия

Единственным поводом для создания такой конструкции может быть желание иметь в двух связанных классах доступные из глобальной области невиртуальные методы с одинаковыми сигнатурами. Однако такая гибкость, скорее, может запутать код и зачастую свидетельствует о плохо разработанном проекте.

Суммируя результаты сравнительного анализа языков С++ и Java, можно сделать однозначный вывод о преимуществе Java перед С++ в области объектно-ориентированного программирования.

По сравнению с С++ Java демонстрирует значительно более гибкую и мощную систему инкапсуляции информации. Вложенные и локальные классы в С++ оказываются малополезными и могут использоваться только как средство разграничения области видимости. В Java классы верхнего уровня, вложенные, локальные и анонимные реализованы в полной мере и увязаны с новыми правилами определения области действий и времени жизни объектов, что делает технику вложенных классов одной из основных во многих приложениях, например для библиотеки классов оконно-графического интерфейса (Java AWT 1.1).

Наследование - это та область, где Java не оставляет никаких шансов С++. Последний обладает сложной, неадекватной, трудной для понимания системой наследования. Конструкции языка Java обязывают разработчика к более строгому программированию, что, в свою очередь, улучшает надежность и понимаемость кода.

Возможности динамического связывания одинаково хорошо представлены как в С++, так и в Java. Однако синтаксическая избыточность С++ в этом вопросе позволяет отдать предпочтение Java и на этот раз.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]