Форум: "Начинающим";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];
Внизметоды Найти похожие ветки
← →
Fleg © (2007-09-06 12:09) [0]Приветствую.
Чем отличается создание нового метода от перекрывания?
в одном самоучителе прочел:"Будьте внимательны: попытка перекрытия с директивой не override, a virtual или dynamic приведет на самом деле к созданию нового одноименного метода."
ситуация была такая:
type
TFirstClass = class
FMyFieldl: Integer;
FMyField2: Longint;
procedure StatMethod;
procedure VirtMethodl; virtual;
procedure VirtMethod2; virtual;
procedure DynaMethodl; dynamic;
procedure DynaMethod2; dynamic;
end;
TSecondClass = class(TMyObject)
procedure StatMethod;
procedure VirtMethodl; override;
procedure DynaMethodl; override;
end;
var
Objl: TFirstClass;
Obj2: TSecondClass;
← →
Инс © (2007-09-06 12:15) [1]
> в одном самоучителе прочел:"Будьте внимательны: попытка
> перекрытия с директивой не override, a virtual или dynamic
> приведет на самом деле к созданию нового одноименного метода.
> "
Неужели так и написано? Приведите точную цитату.
← →
Fleg © (2007-09-06 12:20) [2]это точная цитата.
← →
clickmaker © (2007-09-06 12:25) [3]
> на самом деле к созданию нового одноименного метода
reintroduce
dynamic - меньше кода, но проигрыш по скорости при частых вызовах
← →
Инс © (2007-09-06 12:35) [4]
> это точная цитата.
А ну да, неправильно прочел...
> Чем отличается создание нового метода от перекрывания?
Виртуальные и динамические методы - это методы позднего связывания. Это значит, что указатель на точку входа в метод при его вызове будет подставлен не при компиляции, а непосредственно при вызове. Перекрытие такого метода дает возможность подменить в run-time этот указатель. Вот смотрите ситуацию:
TA = class
public
function VirtualFunc: String; virtual;
procedure ShowMessage;
end;
TB = class(TA)
public
function VirtualFunc: String; override;
end;
...
function TA.VirtualFunc: String;
begin
Result:="A";
end;
procedure TA.ShowMessage;
begin
Application.MessageBox(PChar(VirtualFunc),"",0);
end;
function TB.VirtualFunc: String;
begin
Result:="B";
end;
Создайте экземпляр TB и вызовите метод ShowMessage. А потом попробуйте заменить директиву override на virtual.
← →
fleg © (2007-09-06 12:36) [5]
> меньше кода
?
← →
Инс © (2007-09-06 12:43) [6]
> fleg © (06.09.07 12:36) [5]
>
>
> > меньше кода
>
> ?
Дискуссия по этому поводу...
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=51230
← →
fleg © (2007-09-06 13:00) [7]
> Создайте экземпляр TB и вызовите метод ShowMessage. А потом
> попробуйте заменить директиву override на virtual.
создал, заменил, теперь здесь Application.MessageBox(PChar(VirtualFunc),"",0); он использует метод класса TA.
эта запись всегда равносильна следующей-
Application.MessageBox(PChar(self.VirtualFunc),"",0); ???
← →
Инс © (2007-09-06 13:05) [8]
> Application.MessageBox(PChar(self.VirtualFunc),"",0); ??
> ?
да
← →
fleg © (2007-09-06 13:13) [9]
> Инс ©
Спасибо.)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.09.30;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.115 c