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).

Виртуальные и динамические методы являются семантически эквивалентными. Различие между этими методами проявляется только на этапе выполнения в способе реализации собственно вызова метода. Виртуальные методы оптимизированы по скорости вызова, в то время как динамические – по объему кода.

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

Hosted by uCoz