Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.12;
Скачать: CL | DM;

Вниз

Виртуальные методы   Найти похожие ветки 

 
Начинающий209   (2006-10-27 16:25) [0]

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

 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;

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


 
Reindeer Moss Eater ©   (2006-10-27 16:30) [1]

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


 
Anatoly Podgoretsky ©   (2006-10-27 16:46) [2]

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


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

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


 
Начинающий209   (2006-10-27 16:55) [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). И в зависимости от класса выполняются различные методы.


 
DrPass ©   (2006-10-27 17:13) [5]

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


 
vidiv ©   (2006-10-28 22:23) [6]

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

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 получишь попытку вывести строку в консоль


 
Ketmar ©   (2006-10-28 22:42) [7]

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



Страницы: 1 вся ветка

Текущий архив: 2006.11.12;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.046 c
2-1161862521
Kosh
2006-10-26 15:35
2006.11.12
подсказка


15-1161633915
matt
2006-10-24 00:05
2006.11.12
Бегущий по лезвию


15-1161864240
Pavel__
2006-10-26 16:04
2006.11.12
Сообщение, посылаемое при закрытии приложения


6-1151325615
Cker
2006-06-26 16:40
2006.11.12
Get-запрос


15-1161336921
Тульский
2006-10-20 13:35
2006.11.12
Опрос :-)