Понятие полиморфизма

 

Рассмотренное в предыдущей лекции понятие наследования позволяет использовать методы и данные базовых классов, но при этом различают два вида наследования – статическое и динамическое наследование (статическое и динамическое связывание методов).

Статическое наследование это такое наследование, все связи которого формируются во время компиляции программы и фактически определяются в самой структуре описания классов.

Динамическое наследование, и связанное с ним свойство полиморфизма, предполагают, что некоторые связи формируются в процессе выполнения программы.

Полиморфизм это многообразие форм реализации одноименных методов в цепочке наследуемых классов.

Реализация свойства полиморфизма осуществляется с помощью специальных виртуальных методов и, так называемых, абстрактных базовых классов.

Рассмотрим понятие абстрактных базовых классов.

Для получения преимуществ наследования классов разработчики ООП стали создавать базовые классы, включающих в себя все возможные методы обработки данных определенного множества объектов, но, при этом, базовые классы, как правило, не включали элементы данных.

Например, при создании базового класса «геометрические фигуры» можно включить методы нахождения площади или объема. Естественно, если производным классом является класс «точка» или класс «отрезок», то такие методы для этих объектов лишены смысла.

Базовые классы, для которых создание объектов невозможно или не имеет смысла, стали называть абстрактными базовыми классами. Абстрактные базовые классы служат только для порождения потомков. Как правило, в них задаются только наборы методов, которые каждый из потомков будет реализовывать по-своему. Подобные методы абстрактных базовых классов рассчитаны на несуществующие – виртуальные элементы данных (т.е. на элементы данных будущих классов в цепочке наследования).

Методы, рассчитаны на несуществующие, виртуальные элементы данных будущих классов в цепочке наследования, стали называть виртуальными методами.

Для обозначения виртуальных методов в языке C# используется специальное указание (специальный термин – virtual), означающее, что метод является виртуальным. Например:

virtual public double ploc() {return 0.0;}

Слово virtual в переводе с английского значит «фактический». Объявление метода виртуальным означает, что все ссылки на этот метод будут разрешаться по факту его вызова, то есть не на стадии компиляции, а во время выполнения программы. Этот механизм называется поздним или динамическим связыванием методов.

Встретив виртуальные методы, компилятор создаст таблицу виртуальных методов (Virtual Method Table, VMT), в которую поместит названия виртуальных методов и адреса точек входа. Для каждого класса создается одна таблица виртуальных методов.

При этом во время выполнения программы в каждый создаваемый объект дополнительно включается указатель на созданную таблицу VMT.

Вызов виртуального метода выполняется так: из объекта берется адрес его таблицы VMT, из VMT выбирается адрес метода, а затем управление передается этому методу. Таким образом, при использовании виртуальных методов из всех одноименных методов иерархии всегда выбирается тот, который соответствует фактическому типу вызвавшего его объекта.

Если производный класс имеет свою реализацию одноименного виртуального метода, то в нем этот метод должен объявляться как замещающий или перекрывающий метод с атрибутом override. Например,

override public double ploc() { . . . }

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

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

Замещающий виртуальный метод должен обладать таким же набором параметров, как и одноименный метод базового класса.

Принцип полиморфизма базируется на «перекрытии» виртуальных методов абстрактного базового класса замещающими методами. При этом каждый производный класс может иметь свою индивидуальную форму реализации наследуемых виртуальных или замещающих методов.

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

Полиморфизм, в переводе с греческого языка, означает «много форм», что в данном случае означает «один вызов — много методов».

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








Дата добавления: 2018-11-25; просмотров: 406;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.005 сек.