Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.05;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
2-1183989923
gentos
2007-07-09 18:05
2007.08.05
QReport


15-1183887525
ArtemESC
2007-07-08 13:38
2007.08.05
Есть ли какие-нибудь форумы где можно задавать ...


11-1166730914
MTsv DN
2006-12-21 22:55
2007.08.05
Ошибка в FileSize


15-1183615251
Predfer
2007-07-05 10:00
2007.08.05
У кого какой антивирус?


15-1183907968
ArtemESC
2007-07-08 19:19
2007.08.05
Почему еда (фаст-фуды) стала напоминать пластик?