Виртуальные методы

Они реализуют концепцию полиморфизма.
Полиморфизм - это возможность с одинаковый спецификацией иметь различную реализацию. Один интерфейс - множество реализаций.
Создадим новый метод Volume в классе TBar (перекрывающий, унаследованный). Добавим в описание класса функцию function  TBar.Volume:word.
function TBar.Volume: word;
begin
result:=Fa*Fb*Fe*100;
end;
//Обработчик события
Par1:=TParalllel.Create(1,2,3);
Par1.Show;
Par1:=TBar.Create(1,2,3, 10,5);
Par1.Show;
view raw TBar.pas hosted with ❤ by GitHub
В этом случае результат будет одинаковый. Два раза будет вызван метод Show базового класса.
С функцией Show для объекта Par1 все как планировалось. А в случае с вызовом метода Show для объекта Par1 по причине раннего связывания объектов вызывается метод Volume родительского класса. Вызов Volume в методе Show установлен раз и навсегда по версии, определённой в базовом классе. Компилятор ничего не знает о других методах Volume. То есть в данном случае связь между Volume и Show происходит на этапе компиляции (раньше, чем выполняется сама программа). Для того, чтобы выбор метода не был фиксирован и производился во время работы программы применяется позднее или динамическое связывание. Оно основано на виртуальных механизмах. Необходимо объявить в базовом классе метод Volume виртуально. Это делается добавлением ключевого слова virtual. Данную функцию переопределяем с помощью ключевого слова override.
Класс-потомок может переопределить любой их унаследованных классов.

Комментарии

Популярные сообщения