Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.11.12;
Скачать: [xml.tar.bz2];

Вниз

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

 
Начинающий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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.048 c
15-1161680315
ANB
2006-10-24 12:58
2006.11.12
Баянище


15-1161732708
Германн
2006-10-25 03:31
2006.11.12
"Осеннее обострение"


1-1159639343
Calibr
2006-09-30 22:02
2006.11.12
вопрос по Variant?


2-1161928283
ГореПрограммер
2006-10-27 09:51
2006.11.12
Выбор папки


15-1161764749
Nic
2006-10-25 12:25
2006.11.12
Программа "Camp America"





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский