Форум: "Основная";
Текущий архив: 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.46 MB
Время: 0.028 c