IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

> Виртуальные методы
Bokul
сообщение 2.12.2006 6:24
Сообщение #1


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Серия "Вопросы структурного чайника, который пытается стать объектным самоваром" продолжается.
Для чего или, лучше сказать, в каких случаях надо использовать виртуальные методы? Они дают возможность предкам использовать методы наследников, ну и что? В каких случаях это может пригодится? Мне кажется, что это достаточно трудно спроектировать подобные ситуации, в которых это понадобится. Хотя я очень часто вижу использование этих методов.


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 5)
Lapp
сообщение 2.12.2006 12:08
Сообщение #2


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Вот классический пример, накалякал сейчас на скорую руку. Разберись с ним сначала - Ок?
Думаю, заметишь преимущество.
uses
  CRT;

type
  tThing = object
    procedure Show; virtual;
    procedure Hide; virtual;
    procedure MoveTo(x,y:integer); virtual;
    constructor Create;
  end;

  tStone = object(tThing)
    procedure show; virtual;
    procedure Hide; virtual;
  end;

var
  Stone:tStone;

constructor tThing.Create;
begin
end;

procedure tThing.Show;
begin
end;

procedure tThing.Hide;
begin
end;

procedure tThing.MoveTo(x,y:integer);
begin
  Hide;
  GoToXY(x,y);
  Show
end;

procedure tStone.Show;
begin
  Write('Stone');
end;

procedure tStone.Hide;
begin
  Write('     ');
end;

begin
  With Stone do begin
    Create;
    Show;
    ReadLn;
    MoveTo(10,10);
    ReadLn;
    MoveTo(50,10);
    ReadLn;
    MoveTo(20,20);
    ReadLn;
    MoveTo(70,15);
    ReadLn;
  end
end.

Подсказка: наиди в объекте Stone процедуру MoveTo, которую мы используем с ним..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 2.12.2006 12:50
Сообщение #3


Гость






Цитата
    procedure MoveTo(x,y:integer); virtual;
Здесь виртуальность совершенно не обязательна... Даже если этот метод будет статическим, все равно из него будут вызываться "правильные" процедуры...

Кстати, H.Sutter рекомендует делать открытые (Public, они же интерфейсные) методы НЕвиртуальными, а виртуальными оставлять только Private-методы... yes2.gif
 К началу страницы 
+ Ответить 
Bokul
сообщение 2.12.2006 20:34
Сообщение #4


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Цитата
Кстати, H.Sutter рекомендует делать открытые (Public, они же интерфейсные) методы НЕвиртуальными, а виртуальными оставлять только Private-методы...

То есть виртуальные методы имеют пользу только в пределах одного модуля, программы? Значит логика их применения примерно такая: если методы родителя, которые используются в его других методах, будут переопределены в его потомках, то их надо сделать виртуальными (завертуалить smile.gif )? Правильно?


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 2.12.2006 20:52
Сообщение #5


Гость






Цитата
логика их применения примерно такая:

Виртуальные методы и полиморфизм
 К началу страницы 
+ Ответить 
Bokul
сообщение 3.12.2006 3:23
Сообщение #6


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


volvo, то что надо!!! respect.gif


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 26.07.2025 11:37
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"