Форум: "Начинающим";
Текущий архив: 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
Время: 2.585 c