Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лр-2(Классы).docx
Скачиваний:
3
Добавлен:
16.08.2019
Размер:
142.88 Кб
Скачать

Полиморфизм

Одним из результатов наследования является наличие в классах, унаследованных от базового, некоторых совпадений с ним среди предоставляемых ими методов и свойств. Благодаря этому зачастую оказывается возможным применять для объектов, которые создаются от классов с общим базовым типом, идентичный синтаксис. Например, при наличии у класса Animal метода по имени EatFood() синтаксис для вызова этого метода из производных классов Cow и Chicken будет выглядеть почти одинаково:

001:

002:

003:

004:

Cow myCow = new Cow() ;

Chicken myChicken = new Chicken ();

myCow.EatFood();

myChicken.EatFood();;

Полиморфизм (polymorphism) позволяет двинуться еще дальше, а именно — присваивать переменную базового одного из типа переменной производных типов, как показано ниже:

Animal myAnimal = myCow;

Никакого приведения выполнять не требуется. Далее можно просто вызывать методы базового класса через эту переменную:

myAnimal.EatFood() ;

Данная строка кода приведет к вызову реализации метода EatFood (), содержащейся в производном классе. Важно обратить внимание на то, что вызывать подобным образом методы, определенные в производном классе, нельзя. То есть следующий код работать не будет:

myAnimal.Moo();

Однако приводить переменную типа базового класса в переменную типа производного класса и вызывать метод производного класса показанным ниже образом можно:

Cow myNewCow = (Cow)myAnimal;

myNewCow.Moo();

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

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

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

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