Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите с теорией по виртуальным методам, для тех кто когда-то начинал... 
:(
    Опции темы
AgereS
  Дата 23.6.2004, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 426
Регистрация: 23.6.2004

Репутация: нет
Всего: 3



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

Небольшая предыстория (для того чтобы отвечали по теме).
Начинал с Бейсика.
Потом перешёл на Паскаль (очень понравилось, что к Паскалю можно подключать всякие модули с встроенными в них процедурами и функциями).
Потом перешёл на Дельфи - там я впервые познакомился со всякими объектами-классами (мне это тоже понравилось).
Потом узнал что в Паскале тоже есть объекты, как и в Дельфи...
А потом... встретился с виртуальными медодами, которые не могу понять (ну не лезет мне это в башню mad.gif).
Вот такая вот предыстория...
PM MAIL ICQ   Вверх
<Spawn>
Дата 23.6.2004, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Приведу пример, на основе которого, надеюсь, станет понятно. Допустим у тебя есть базовый класс 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) таблица, на основе которой и осуществляется вызов нужного метода.

Так понятно?

Это сообщение отредактировал(а) <Spawn> - 23.6.2004, 16:21


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
AgereS
Дата 23.6.2004, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 426
Регистрация: 23.6.2004

Репутация: нет
Всего: 3



Вы не поверите - то же самое я прочитал в книжке, но почему-то не придал этому значения. После Вашего сообщения стало всё понятно. rolleyes.gif
ЗЫ Как всё-таки здорово в чём нибудь разобраться, пусть с чужой помощью. exclamation.gif
PM MAIL ICQ   Вверх
<Spawn>
Дата 23.6.2004, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



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

Это сообщение отредактировал(а) <Spawn> - 23.6.2004, 16:47


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
AgereS
Дата 23.6.2004, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 426
Регистрация: 23.6.2004

Репутация: нет
Всего: 3



Object Pascal в Delphi 5 hehe.gif

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

Это сообщение отредактировал(а) AgereS - 24.6.2004, 09:39
PM MAIL ICQ   Вверх
<Spawn>
Дата 23.6.2004, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



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

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


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Петрович
Дата 24.6.2004, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 25
Всего: 55



Цитата
Вы не поверите - то же самое я прочитал в книжке

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

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

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


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
<Spawn>
Дата 24.6.2004, 05:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



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

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

Это сообщение отредактировал(а) <Spawn> - 24.6.2004, 05:10


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
AgereS
Дата 24.6.2004, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 426
Регистрация: 23.6.2004

Репутация: нет
Всего: 3



Всем спасибо adv/49.gif
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0486 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.