Форум: "Начинающим";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];
Внизvirtual или dynamic metods Найти похожие ветки
← →
nali (2007-07-08 23:44) [0]Подскажите в каких случаях лучше объявлять методы как virtual
а в каких dynamic?
← →
ferr © (2007-07-08 23:53) [1]Насколько помнится обращение к dynamic занимает больше времени, но их структура занимает меньше места в памяти. Отсюда сам выводы делай.
Что касается вопроса, то я бы посоветовал использовать virtual, для повышения "кросс-язычности".
← →
Инс © (2007-07-09 00:02) [2]Разница между виртуальным и динамическим методов в том, где и как хранятся ссылки на виртуальные и динамические методы и как происходит их вызов. Информация о виртуальных методах хранится в таблице виртуальных методов (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 не нужно писать сигнатуру файла, а в файл - нужно. Ну или еще какие-либо различия могут быть...
← →
Kolan © (2007-07-09 11:19) [3]> Вывод следующий: если ваш виртуальный метод в ряд ли будет
> перекрыт в потомке(ах), то может быть имеет смысл сделать
> его динамическим,
Если его не перекрою, то почемубы вообще не использовать ниvirtual;
ниdynamic;
?
← →
evvcom © (2007-07-09 11:28) [4]
> Kolan © (09.07.07 11:19) [3]
а если подразумевается, что поведение все же может измениться? Вероятность невелика, но все же имеется?
← →
Инс © (2007-07-09 11:31) [5]
> Если его не перекрою, то почемубы вообще не использовать
> ни virtual; ни dynamic;?
evvcom © прав. В структуру классов нужно изначально закладывать гибкость. Это вовсе не означает, что теперь каждый метод нужно делать виртуальным. Но возможности наследования от этого класса нужно предусматривать.
← →
DrPass © (2007-07-09 12:00) [6]
> Если его не перекрою, то почемубы вообще не использовать
Это творческая задача. Если ты проектируешь какой-либо класс, то вполне можно определиться, какие метоты следует сделать виртуальными, а какие - нет. В то же время вопросом
> если подразумевается, что поведение все же может измениться?
> Вероятность невелика, но все же имеется?
...можно особо не задаваться, т.к. дописать слово virtual при необходимости в будущем тоже не особо сложно :) По крайней мере, если ты этот класс пишешь для себя, и не планируешь распространять.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.048 c