Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
7 семестр / Учебники / Все лекции С# / Все лекции С# / Лекция 13_часть2. ООП.Члены класса. Основные свойства ООП.doc
Скачиваний:
157
Добавлен:
24.02.2016
Размер:
143.36 Кб
Скачать

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

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

Члены базового класса могут описываться также как virtual (виртуальный), что означает, что такой член может быть переопределен классом, который его наследует. Другими словами, производный класс может использовать альтернативную реализацию данного члена. Это и есть одно из определений полиморфизма.

В примере с животными можно объявить метод EatFood() виртуальным и использовать для него другую реализацию во всех производных классах, например, в классе Cow (рисунок 13.7). Здесь метод EatFood() изображен как для класса Animal, так и для класса Cow с той целью, чтобы показать, что в этих классах используется своя собственная реализация. Для класса Chicken реализация метода EatFood() останется без изменений.

Animal

+virtual EatFood()


Chicken

+ Cluck()

+LayEgg()

Cow

+ Moo()

+SupplyMilk()

+EatFood()


Рисунок 13.7 - UML-представление разновидности полиморфизма - виртуальный метод

Полиморфизм оказывается чрезвычайно полезным методом, позволяя выполнять операции над различными объектами, происходящими от одного класса, с использованием минимального количества кода. Обратите внимание, что использовать полиморфизм могут не только классы, у которых имеется один и тот же непосредственный класс-родитель: существует возможность таким же образом обращаться, например, к дочернему и внучатому классам, поскольку у них имеется общий класс в иерархии наследования.

Вторая разновидность полиморфизма полиморфизм для конкретного случая (ad hoc polymorphism). Этот тип полиморфизма позволяет обращаться схожим образом к объектам, не связанным классическим наследованием. Достигается это очень просто: в каждом из таких объектов должен быть метод с одинаковой сигнатурой (то есть одинаковым именем метода, принимаемыми параметрами и типом возвращаемого значения). В языках, поддерживающих полиморфизм этого типа, применяется технология “позднего связывания”, когда тип объекта, к которому происходит обращение, становится ясен только в процессе выполнения программы. В зависимости от того, к какому типу (объекту) происходит обращение, вызывается нужный метод.

Запомните, что в С# все классы являются производными от базового класса object, который является корневым в их иерархии наследования. Следовательно, с любыми объектами можно обращаться как с экземплярами класса object. Именно поэтому функция Console.WriteLine() оказывается в состоянии обрабатывать бесконечное количество комбинаций параметров при формировании строки. Каждый параметр, кроме первого, рассматривается как экземпляр класса object, в результате чего возможен вывод на экран выходного потока произвольного объекта.