Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];

Вниз

Виртуальные и динамические методы   Найти похожие ветки 

 
Denis   (2003-10-30 11:53) [0]

Здравствуйте мастера!
У меня такой вопрос: по какому принципу в описании класса нужно указывать что тот или иной метод является виртуальным или динамическим?
Смотрю сейчас в книгу, там написано, что разница между этими методами - в особенности поиска адреса. В схеме структуры объекта показано, что указатель на объект "смотрит" на указатель на класс, тот указывает на RTTI, одно из полей которой указывает на таблицу динамических методов. Но все же мне не совсем понятен смысл разделения на виртуальные и динамические. Объясните пожалуйста рабоче-крестьянским языком.


 
Skier   (2003-10-30 11:59) [1]


> по какому принципу в описании класса нужно указывать что
> тот или иной метод является виртуальным или динамическим?
>

если нужна скорость то virtual,
если нужно экономия памяти то dynamic


 
Nikolay M.   (2003-10-30 12:03) [2]

Все правильно, ничем больше на различаются.
Одни для экономии памяти, другие - для увеличения быстродействия.
Но вот какие рекомендации дает хелп, когда что использовать:

In general, virtual methods are the most efficient way to implement polymorphic behavior.

Dynamic methods are useful when a base class declares many overridable methods which are inherited by many descendant classes in an application, but only occasionally overridden.


 
Малиновский Владимир   (2003-10-30 12:04) [3]

Virtual and dynamic methods are semantically equivalent. They differ only in the implementation of method-call dispatching at runtime. Virtual methods optimize for speed, while dynamic methods optimize for code size.

In general, virtual methods are the most efficient way to implement polymorphic behavior. Dynamic methods are useful when a base class declares many overridable methods which are inherited by many descendant classes in an application, but only occasionally overridden.

Т.е. используйте, что нарвится, но, если не работаете с Ассемблером, и нет проблем c лишними килобайтами памяти под приложение, то не обращайте внимание, всегда используйте virtual.


 
Skier   (2003-10-30 12:23) [4]

И ещё, лучше поступать так : в классе-предке объявляешь как dynamic методы, только те методы, которые, предположительно, редко будут перекрываться (override) в классе-потомке


 
Denis   (2003-10-30 12:25) [5]

То бишь нет пока нужды ломать себе голову, а просто использовать virtual? Ясненько.

И еще одна непоняточка. Исходя из того же опуса, что лежит передомной, я сделал вывод, что override используется для "замены" метода базового класса своим методом дочернего класса, а inherited - для вызова из дочернего класса перекрытого метода базового класса, так сказать, в оригинале.
Это правильное понимание или я что-то упустил?


 
Skier   (2003-10-30 12:27) [6]


> Это правильное понимание или я что-то упустил?

Правильное


 
han_malign   (2003-10-30 13:05) [7]

Вообще, у динамических методов, есть еще одна полезная фича - и, если покопаться в system.pas, вы увидите, как она активно используется под "псевдонимом" message (TObject.Dispatch)...


 
han_malign   (2003-10-30 13:16) [8]

> а inherited - для вызова из дочернего класса перекрытого метода базового класса
- насколько я помню, для статических методов inherited тоже проходит...

З.Ы. Что бы в будущем не ломал голову, на что ругается компилятор (Incompatible type - помоему) в :
function TMyClass.Func(aParam: TParam): TResult;
begin
Result:=inherited;{"Result:=" может быть опущен}
......
end;
- сразу поясню, что в этом месте придется писать полностью
Result:=inherited Func(aParam){"Result:=" может быть опущен} - такова воля Borland-а - в вызове родительских функций нельзя опускать параметры...


 
Denis   (2003-10-30 13:23) [9]


> han_malign © (30.10.03 13:05) [7]


Нашел, но ничего не понял.

{ TObject.Dispatch accepts any data type as its Message parameter. The
first 2 bytes of the data are taken as the message id to search for
in the object"s message methods. TDispatchMessage is an example of
such a structure with a word field for the message id.
}
TDispatchMessage = record
MsgID: Word;
end;


Это?



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.06 c
1-41330
GIL
2003-10-30 17:21
2003.11.13
остановить программу


1-41232
Ganjo
2003-11-01 01:22
2003.11.13
проблема с удалением файла


7-42162
Zero Ice
2003-09-04 17:41
2003.11.13
RasApi


14-42131
Nelud
2003-10-14 20:31
2003.11.13
Псевдо-двоичная система счисления


1-41368
REA
2003-11-04 16:48
2003.11.13
Параметры COM





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