Главная страница
    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.47 MB
Время: 0.052 c
2-1188549329
@!!ex
2007-08-31 12:35
2007.09.30
Почтовый клиент.


2-1189010873
Виктор007
2007-09-05 20:47
2007.09.30
Формат map файла


2-1188802512
Dmitriy_
2007-09-03 10:55
2007.09.30
Как нажать на кнопку в окне браузера


8-1167149205
S1lent
2006-12-26 19:06
2007.09.30
Карта высот


15-1188904717
SerJaNT
2007-09-04 15:18
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский