Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.30;
Скачать: CL | DM;

Вниз

методы   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.026 c
6-1170223586
slartus
2007-01-31 09:06
2007.09.30
Список FTP-серверов в локальной сети


1-1184934235
Mitrofan
2007-07-20 16:23
2007.09.30
Отладка нитей в Delphi


15-1188802178
@!!ex
2007-09-03 10:49
2007.09.30
Преподавание религиозных предметов.


3-1180356563
Чип
2007-05-28 16:49
2007.09.30
фильтрация


3-1180354657
Вадим71
2007-05-28 16:17
2007.09.30
Как записать дату и время в smallDateTime