43. Статические, динамические и виртуальные методы.
Методы могут быть статическими (static – по умолчанию), виртуальными (virtual) или динамическими (dynamic). Виртуальные и динамические методы могут быть перекрытыми (override) и абстрактными (abstract). Эти спецификаторы (designators) методов играют роль тогда, когда объектом является класс-наследник. Они определяют, какая именно реализация метода будет вызвана в том или ином случае.
Статические методы (Static methods).
Методы являются статическими по умолчанию и слово static не указывается. Когда вызывается статический метод, для определения конкретной реализации метода используется информация времени компиляции. В следующих описаниях методы Draw являются статическими:
type
TFigure = class
procedure Draw;
end;
TRectangle = class(TFigure)
procedure Draw;
end;
С учетом этих описаний следующий код иллюстрирует вызов статических методов:
var
Figure: TFigure;
Rectangle: TRectangle;
begin
Figure := TFigure.Create;
Figure.Draw; // вызывается TFigure.Draw
Figure.Free;
Figure := TRectangle.Create;
Figure.Draw; // вызывается TFigure.Draw
TRectangle(Figure).Draw; // вызывается TRectangle.Draw
Figure. Free;
Rectangle := TRectangle.Create;
Rectangle.Draw; // вызывается TRectangle.Draw
Rectangle.Free;
end;
Виртуальные и динамические методы.
Для того чтобы сделать метод виртуальным или динамическим, надо добавить соответствующую директиву в его описание. Эти методы, в отличие от статических, могут быть перекрытыми (override) в классах наследниках.
Когда вызывается перекрытый метод, действительный, т.е. времени выполнения, тип класса или объекта, использованный в вызове метода (а не объявленный тип), определяет, какая реализация будет вызвана.
Для перекрытия метода его надо объявить с директивой override. Заголовок перекрывающего метода должен в точности соответствовать заголовку метода в родительском классе. В программе Method_Binding иллюстрируется специфика виртуальных и перекрытых методов.
Несмотря на то, что только виртуальные и динамические методы могут перекрываться, все методы могут быть перегружены (overload).
Виртуальные и динамические методы являются семантически эквивалентными. Различие между этими методами проявляется только на этапе выполнения в способе реализации собственно вызова метода. Виртуальные методы оптимизированы по скорости вызова, в то время как динамические – по объему кода.
В основном, виртуальные методы являются наиболее эффективным путем достижения преимуществ полиморфизма. Динамические методы полезны тогда, когда базовый класс имеет много потенциально перекрываемых методов, которые наследуются многочисленными производными классами приложения, однако только изредка в действительности перекрываются.