Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
3-1180071110
Emik
2007-05-25 09:31
2007.09.30
помогите с вставкою


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


15-1188377480
Denis_
2007-08-29 12:51
2007.09.30
Браузеры


15-1188915329
savyhinst
2007-09-04 18:15
2007.09.30
Лазарус


4-1175317863
igornov
2007-03-31 09:11
2007.09.30
Как получить список запущенных приложений из службы?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский