Слайд 2Понятие позднего и раннего связывания
При изучении темы полиморфизма важно понять понятие позднего
и раннего связывания, которое используется компилятором при построении кода программы в случае наследования.
Если классы образовывают иерархию наследования, то при обращении к элементам класса, компилятор может реализовывать один из двух возможных способов связывания кода:
Раннее связывание – связанное с формированием кода на этапе компиляции. При раннем связывании, программный код формируется на основе известной информации о типе (класс) ссылки. Как правило, это ссылка на базовый класс в иерархии классов.
Позднее связывание – связанное с формированием кода на этапе выполнения. Если в иерархии классов встречается цепочка виртуальных методов (с помощью слов virtual, override), то компилятор строит так называемое позднее связывание. При позднем связывании вызов метода происходит на основании типа объекта, а не типа ссылки на базовый класс. Позднее связывание используется, если нужно реализовать полиморфизм
Слайд 3Понятие позднего и раннего связывания
Выбор того или иного вида связывания для каждого
отдельного элемента (метода, свойства, индексатора и т.п.) определяется компилятором по следующим правилам:
если в иерархии унаследованных классов объявляется невиртуальный элемент, то реализуется раннее связывание;
если в иерархии унаследованных классов объявляется виртуальный элемент, то выполняется позднее связывание. Виртуальный элемент в базовом классе обозначается ключевым словом virtual, во всех унаследованных классах ключевым словом override.
Слайд 4Необходимые условия для реализации позднего связывания:
классы должны образовывать иерархию наследования;
в классах должны
быть методы с одинаковой сигнатурой. Элементы (методы) производных классов должны перекрывать (override) соответствующие элементы (методы) базовых классов;
элементы (методы) класса должны быть виртуальными, то есть должны быть обозначены ключевыми словами virtual, override.
Слайд 6Позднее связывание
В случае позднего связывания, сначала на основе описания классов A, B компилятор определяет, что
метод Print() есть виртуальным. Для виртуального метода компилятор строит таблицу виртуальных методов Print(), которая содержит смещение адресов каждого виртуального метода для каждого класса иерархии.
Слайд 8Что такое полиморфизм? Динамический полиморфизм
Полиморфизм – это свойство программного кода изменяться в зависимости
от ситуации, которая возникает в момент выполнения программы.
Главный принцип полиморфизма – один интерфейс, много реализаций (методов). В терминах языка программирования, полиморфизм – это возможность с помощью ссылки на базовый класс обращаться к элементам (методов) экземпляров унаследованных классов единым унифицированным способом.
Слайд 9Использование преимуществ полиморфизма возможно в ситуациях:
когда классы образовывают иерархию с помощью концепции
наследования;
когда в классах, которые образовывают иерархию, есть элементы (методы, свойства и т.п.) с одинаковой сигнатурой. В таких случаях возникает понятие «переопределение метода» (method override).
Слайд 10Полиморфизм. Ключевые слова
В языке программирования C# полиморфизм обеспечивается с помощью ключевых слов virtual и override.
Благодаря использованию этих ключевых слов обеспечивается динамический полиморфизм. Термин «динамический» означает, что вызов виртуального элемента осуществляется динамично во время выполнения программы в зависимости от типа объекта, для которого этот элемент вызывается.
Слайд 12Какие требования накладываются на элемент класса для того, чтобы он поддерживал полиморфизм?
Для
того, чтобы элемент класса (например метод) поддерживал полиморфизм, его нужно сделать виртуальным. Чтобы элемент класса был виртуальным, нужно выполнить следующие требования:
в базовом классе этот элемент (метод, свойство) должен быть обозначен как virtual или abstract. Ключевое слово abstract также делает элемент виртуальным. Это слово используется, если элемент класса есть абстрактным.
в производных классах одноименные элементы должны быть обозначены как override. Если в производном классе нужно реализовать невиртуальный метод, имя которого совпадает с виртуальным методом базового класса, то этот метод обозначается ключевым словом new
Слайд 13Использование ключевого слова new в цепочке виртуальных методов.
Как известно, элемент класса, который объявлен виртуальным
(virtual), передает возможность реализовать полиморфизм в одноименных элементах унаследованных классов. Таким образом, виртуальные элементы образовывают цепочку вниз по иерархии.
Для того, чтобы элемент класса, который переопределяет (override) виртуальный элемент базового класса, не поддерживал полиморфизм нужно указать ключевое слово new. Если в цепочке одноименных виртуальных методов встречается один невиртуальный метод (с ключевым словом new) то этот метод разрывает цепочку.