Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.038 c
1-1179831235
parasolka
2007-05-22 14:53
2007.08.05
Работа с несколькими мониторами.


4-1171894247
Vemer
2007-02-19 17:10
2007.08.05
Какое сообщение посылаеться при смене экранного разрешения?


1-1179980987
Shadow__
2007-05-24 08:29
2007.08.05
Сценарий взаимодействия клиента и сервера


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


2-1183851195
RWolf
2007-07-08 03:33
2007.08.05
TListView, OwnerDraw, артефакты при ресайзе колонок





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