Главная страница
    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.037 c
1-1159106424
fs_more
2006-09-24 18:00
2006.11.12
Передача данных в сообщении (SendMessage / PostMessage)


6-1150718257
Kryakozyablik
2006-06-19 15:57
2006.11.12
Подключение интернета (ADSL)


15-1161339758
Jeer
2006-10-20 14:22
2006.11.12
С днем связи, связисты ! :)


2-1161784589
DevilDevil
2006-10-25 17:56
2006.11.12
WM_KILLFOCUS


3-1158303765
syte_ser78
2006-09-15 11:02
2006.11.12
вложенный запрос





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский