![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
virtual или dynamic metods
nali © (2007-07-08 23:44:00)Подскажите в каких случаях лучше объявлять методы как virtual
а в каких dynamic?
DrPass (2007-07-09 12:00:00) [1]
> Если его не перекрою, то почемубы вообще не использовать
Это творческая задача. Если ты проектируешь какой-либо класс, то вполне можно определиться, какие метоты следует сделать виртуальными, а какие - нет. В то же время вопросом
> если подразумевается, что поведение все же может измениться?
> Вероятность невелика, но все же имеется?
...можно особо не задаваться, т.к. дописать слово virtual при необходимости в будущем тоже не особо сложно :) По крайней мере, если ты этот класс пишешь для себя, и не планируешь распространять.
Инс (2007-07-09 11:31:00) [2]
> Если его не перекрою, то почемубы вообще не использовать
> ни virtual; ни dynamic;?
evvcom © прав. В структуру классов нужно изначально закладывать гибкость. Это вовсе не означает, что теперь каждый метод нужно делать виртуальным. Но возможности наследования от этого класса нужно предусматривать.
evvcom (2007-07-09 11:28:00) [3]
> Kolan © (09.07.07 11:19) [3]
а если подразумевается, что поведение все же может измениться? Вероятность невелика, но все же имеется?
Kolan (2007-07-09 11:19:00) [4]> Вывод следующий: если ваш виртуальный метод в ряд ли будет
> перекрыт в потомке(ах), то может быть имеет смысл сделать
> его динамическим,
Если его не перекрою, то почемубы вообще не использовать ниvirtual;ниdynamic;?
Инс (2007-07-09 00:02:00) [5]Разница между виртуальным и динамическим методов в том, где и как хранятся ссылки на виртуальные и динамические методы и как происходит их вызов. Информация о виртуальных методах хранится в таблице виртуальных методов (VMT). В этой таблице хранятся не только виртуальные методы данного класса, но и всех его предков. Таким образом, создавая потомка класса, вся VMT предка переносится в потомок и там к ней добавляются новые методы, объявленные в потомке. В результате этого, поиск нужного метода занимает мало времени, так как класс имеет всю информацию о своих виртуальных методах. Динамические же методы не дублируются в DMT (таблица динамических методов) потомка. DMT класса содержит только методы, объявленные в этом классе. Т.е. при вызове динамического метода, сначала будет идти поиск в DMT данного класса, если метод не найден - то в DMT предка класса и т.д. Очевидно, что использование виртуальных методов требует больший расход памяти из-за необходимости хранения массивных VMT всех классов, зато они вызываются быстро. Динамические методы же вызываются дольше в силу того, что сложнее поиск метода в DMT, но зато эти таблицы компактные, не занимают много места в памяти. Вывод следующий: если ваш виртуальный метод в ряд ли будет перекрыт в потомке(ах), то может быть имеет смысл сделать его динамическим, чтобы не плодить лишние ссылки в VMT потомков данного класса. А если метод наверняка перекроют, то сделайте его лучше виртуальным. Хотя многие советуют всегда использовать виртуальные и не заморачиваться, что-то в этом есть, в прочем, выбор каждого. Я, например, использую динамические в случаях, подобных следующему:
TMyClass = class
protected
procedure SaveToStream(Stream: TStream); virtual; abstract;
procedure LoadFromStream(Stream: TStream); virtual; abstract;
procedure SaveToFile(FileName: String); dynamic;
procedure LoadFromFile(FileName: String); dynamic;
end;
...
procedure TMyClass.SaveToFile(FileName: String);
var
Stream: TFileStream;
begin
Stream:=TFileStream.Create(FileName, fmCreate);
try
SaveToStream(Stream);
finally
Stream.Free;
end;
end;
procedure TMyClass.LoadFromFile(FileName: String);
var
Stream: TFileStream;
begin
Stream:=TFileStream.Create(FileName, fmOpenRead);
try
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
Потомков у класса теоретически может быть много. В ряд ли динамические методы будут перекрыты, для большинства случаев подойдет такой вариант их реализации. Но возможно нужно будет перекрыть, например в Stream не нужно писать сигнатуру файла, а в файл - нужно. Ну или еще какие-либо различия могут быть...
ferr (2007-07-08 23:53:00) [6]Насколько помнится обращение к dynamic занимает больше времени, но их структура занимает меньше места в памяти. Отсюда сам выводы делай.
Что касается вопроса, то я бы посоветовал использовать virtual, для повышения "кросс-язычности".