Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.014 c
15-1188714738
_messageboxa
2007-09-02 10:32
2007.09.30
Разбить диск


3-1179483915
Parenek
2007-05-18 14:25
2007.09.30
как узнать, добавлена ли запись ?


15-1188885671
Админ
2007-09-04 10:01
2007.09.30
Ищу софт для FireBird


2-1188226449
ares18
2007-08-27 18:54
2007.09.30
Про глюки XOR алгоритма


2-1188644231
17Landgraf
2007-09-01 14:57
2007.09.30
Вопрос по поводу свойства Charset класса TFont




   Наверх