Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

методы [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
> приведет на самом деле к созданию нового одноименного метода.
> "

Неужели так и написано? Приведите точную цитату.


Наверх

Титульная страница Поиск, карта сайта Написать письмо