Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Виртуальные методы


Начинающий209 ©   (2006-10-27 16:25:00) 

Никак не могу понять одну простую вещь. Объясните, пожалуйста, простым языком "для чайников", зачем нужны виртуальные методы?
К примеру два фрагмента кода:

 TMyObj1 = class(TObject)
 private
   procedure MyProc; virtual;
 end;

 TMyObj2 = class(TMyObj1)
 private
   procedure MyProc; override;
 end;

и

 TMyObj1 = class(TObject)
 private
   procedure MyProc;
 end;

 TMyObj2 = class(TMyObj1)
 private
   procedure MyProc;
 end;

Какие преимущество первого подхода? И как их использовать? Извините, конечно, за глупый вопрос. Но многое прочитав по теме, этого не понял.


Ketmar   (2006-10-28 22:42:00) [1]

тут лучше делать TAbstractOutput</base> с абстрактным методом. а потом "наворачивать". %-)


vidiv   (2006-10-28 22:23:00) [2]

Вообще неправильно...
Вот пример для чего это надо:

TOutput=class(TObject)
  procedure StrWrite(s:string); virtual;
  procedure StrWriteln(s:string);
end;

Procedure TOutput.StrWrite(s:string);
begin
   write(s); // выводим в консоль
end;

Procedure TOutPut.StrWriteln(s:string);
begin
  StrWrite(s + #13); // выводим с помощью функции StrWrite;
end;

И тут тебе вздумалось, к примеру, выводить строки в Form1.Memo1 и делаешь потомка:

TMemoOutput=class(TOutput)
  procedure StrWrite(s:string); override;
end;

procedure TMemoOutput.StrWrite(s:string);
begin
   with Form1.Memo1 do
      Text := Text + s;
end;

в данном случае оба метода класса TMemoOutput будут работать как надо...
А если убрать virtual и override, то про выполнении TMemoOutput.StrWriteln получишь попытку вывести строку в консоль


DrPass   (2006-10-27 17:13:00) [3]

Абсолютно правильно


Начинающий209   (2006-10-27 16:55:00) [4]

Для понимания полиморфизма я написал следующее:

{ TMyObj1 }

procedure TMyObj1.MyProc;
begin
 ShowMessage('a');
end;

{ TMyObj2 }

procedure TMyObj2.MyProc;
begin
 ShowMessage('b');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Obj1: TMyObj1;
 Obj2: TMyObj2;
 Obj: TMyObj1;
begin
 Obj1 := TMyObj1.Create;
 Obj2 := TMyObj2.Create;
 Obj := Obj1;
 obj.MyProc;
 Obj := Obj2;
 obj.MyProc;
end;

Для виртуальных и статических методов выдает разные результаты. Надеюсь, я правильно понял идею полиморфизма: Есть некий объект (у меня Obj), который в Run-Time может быть ссылкой на объекты различных классов (TMyObj1 и TMyObj2). И в зависимости от класса выполняются различные методы.


Начинающий209   (2006-10-27 16:47:00) [5]

ОК. Спасибо. Пробел был в понимании полиморфизма. Перечитал еще раз про полиморфизм и вроде кое-что понял. :)


Anatoly Podgoretsky   (2006-10-27 16:46:00) [6]

В приведеном коде никакого.


Reindeer Moss Eater   (2006-10-27 16:30:00) [7]

Преимущества в вытекающей из первого метода возможности полиморфизма.


Наверх

Титульная страница Поиск, карта сайта Написать письмо