![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
методы [D7, XP]
Fleg © (2007-09-06 12:09:00)Приветствую.
Чем отличается создание нового метода от перекрывания?
в одном самоучителе прочел:"Будьте внимательны: попытка перекрытия с директивой не 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;
fleg (2007-09-06 13:13:00) [1]
> Инс ©
Спасибо.)
Инс (2007-09-06 13:05:00) [2]
> Application.MessageBox(PChar(self.VirtualFunc),'',0); ??
> ?
да
fleg (2007-09-06 13:00:00) [3]
> Создайте экземпляр TB и вызовите метод ShowMessage. А потом
> попробуйте заменить директиву override на virtual.
создал, заменил, теперь здесь Application.MessageBox(PChar(VirtualFunc),'',0); он использует метод класса TA.
эта запись всегда равносильна следующей-
Application.MessageBox(PChar(self.VirtualFunc),'',0); ???
Инс (2007-09-06 12:43:00) [4]
> fleg © (06.09.07 12:36) [5]
>
>
> > меньше кода
>
> ?
Дискуссия по этому поводу...
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=51230
fleg (2007-09-06 12:36:00) [5]
> меньше кода
?
Инс (2007-09-06 12:35:00) [6]
> это точная цитата.
А ну да, неправильно прочел...
> Чем отличается создание нового метода от перекрывания?
Виртуальные и динамические методы - это методы позднего связывания. Это значит, что указатель на точку входа в метод при его вызове будет подставлен не при компиляции, а непосредственно при вызове. Перекрытие такого метода дает возможность подменить в 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.
clickmaker (2007-09-06 12:25:00) [7]
> на самом деле к созданию нового одноименного метода
reintroduce
dynamic - меньше кода, но проигрыш по скорости при частых вызовах
Fleg (2007-09-06 12:20:00) [8]это точная цитата.
Инс (2007-09-06 12:15:00) [9]
> в одном самоучителе прочел:"Будьте внимательны: попытка
> перекрытия с директивой не override, a virtual или dynamic
> приведет на самом деле к созданию нового одноименного метода.
> "
Неужели так и написано? Приведите точную цитату.