Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > помогите с теорией по виртуальным методам


Автор: AgereS 23.6.2004, 16:00
никак не могу понять: для чего нужны виртуальные методы в Дельфи. со статическими я кое-как разобрался.

Небольшая предыстория (для того чтобы отвечали по теме).
Начинал с Бейсика.
Потом перешёл на Паскаль (очень понравилось, что к Паскалю можно подключать всякие модули с встроенными в них процедурами и функциями).
Потом перешёл на Дельфи - там я впервые познакомился со всякими объектами-классами (мне это тоже понравилось).
Потом узнал что в Паскале тоже есть объекты, как и в Дельфи...
А потом... встретился с виртуальными медодами, которые не могу понять (ну не лезет мне это в башню mad.gif).
Вот такая вот предыстория...

Автор: <Spawn> 23.6.2004, 16:20
Приведу пример, на основе которого, надеюсь, станет понятно. Допустим у тебя есть базовый класс TFigureObject, имеющий виртуальный метод Draw(Пустой)

Код
TFigureObject = class(TObject)
 private
   FCanvas: TCanvas;
   ....
 public
   ....
   procedure Draw; virtual;
end;

procedure TFigureObject.Draw;
begin
 //Пустой метод
end;


Тогда ты можешь сделать наследника от этого класса и переопеределить метод Draw. Допустим это будет TEllipse:

Код
TEllipse = class(TFigureObject)
 public
   ...
   procedure Draw; override;
end;

procedure TEllipse.Draw;
begin
 FCanvas.Ellipse(...);
end;


И, допустим, есть класс TRectangle:

Код
TRectangle = class(TFigureObject)
 public
   procedure Draw; override;
end;

procedure TRectangle.Draw;
begin
 FCanvas.Rectangle(...);
end;


Тогда если ты, допустим, создашь массив обьектов TFigureObject

Код
FiguteObjects: array of TFigureObject;


и инициализируешь какое то количество элементов этого массива экземплярами классов TEllipse и TRectangle, то при вызове метода FigureObjects[i].Draw будет происходить вызов метода наслединка, то есть будте рисоваться либо эллипс, либо прямоугольник, в зависимости от того экземпляр какого обьекта был добавлен в массив.

Ну а если по теории, то для виртуальных(virtual) и динамических методов(dynamic) создается специальная VMT(Virtual Method Table) таблица, на основе которой и осуществляется вызов нужного метода.

Так понятно?

Автор: AgereS 23.6.2004, 16:38
Вы не поверите - то же самое я прочитал в книжке, но почему-то не придал этому значения. После Вашего сообщения стало всё понятно. rolleyes.gif
ЗЫ Как всё-таки здорово в чём нибудь разобраться, пусть с чужой помощью. exclamation.gif

Автор: <Spawn> 23.6.2004, 16:44
Наверное, читал чего нибудть типа "Delphi 5(6) в подленнике" smile.gif ? Я, если мне не изменяет память, видел в этой книге похожий пример года полтора назад, когда только начинал изучать Дельфи.

Автор: AgereS 23.6.2004, 16:51
Object Pascal в Delphi 5 hehe.gif

Не подскажите куда мне дальше двигаться в Дельфи, чтобы на месте не стоять (очень прошу bored.gif)

Автор: <Spawn> 23.6.2004, 18:04
Цитата(AgereS @ 23.6.2004, 08:51)
Не подскажите куда мне дальше двигаться в Дельфи, чтобы на месте не стоять (очень прошу bored.gif)

Придумай для себя задачу и реализуй ее, а потом еще и еще и еще... Пока не поймешь, что хорошо понял ту или иную сферу программирования, а потом приступай к другой и ..... короч на всю жизнь хватит, так как технологии не стоят на месте, а стремительными темпами развиваютсяsmile.gif)

Автор: Петрович 24.6.2004, 00:03
Цитата
Вы не поверите - то же самое я прочитал в книжке

Да, это уже классический пример, причем очень наглядный.
Цитата
то для виртуальных(virtual) и динамических методов(dynamic)

Во во, кстати. А чем-же по сути отличаются virtual-методы от dynamic-методов. Знаю что в реализации отличаются. А вот в каких случаях предпочтительней применять одни а в каких другие, как-то не задумывался. Может поясните, что-бы самому не думать smile.gif.
Цитата
Придумай для себя задачу и реализуй ее, а потом еще и еще и еще...

К сожалению, на мой взгляд единственно правильный способ чему-либо научиться.

Автор: <Spawn> 24.6.2004, 05:09
Цитата
Во во, кстати. А чем-же по сути отличаются virtual-методы от dynamic-методов. Знаю что в реализации отличаются. А вот в каких случаях предпочтительней применять одни а в каких другие, как-то не задумывался. Может поясните, что-бы самому не думать smile.gif.

Я сам не особенно много знаю в этом вопросе, но вот что могу сказать. Динамические и виртуальные методы работают внешне одинаково - вся разница во внутренностях. При создании виртуального метода его адресс помещается во все VMT таблицы всех наследников данного класса, а у динамического ифнормация о динамическом методе предка копируется в наследника, только если в этом наследнике метод был перекрыт. Поиск динамическо метода в VMT производится по специальному уникальному идентификатору. Из за такой структуры, динамические методы вызываются чуть медленнее чем виртуальные, зато при глубокой иерархии классов экономится место в памятиsmile.gif))

Автор: AgereS 24.6.2004, 09:51
Всем спасибо adv/49.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)