Форум: "Начинающим";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];
ВнизПереопределение методов, я не понимаю Найти похожие ветки
← →
Peter1 (2005-08-06 17:51) [0]Значит есть у меня класс.
TBaseClass = class
procedure MyStatic;
procedure MyVirtual; virtual;
end;
Далее, создаю его потомка
TNewBase = class (TBaseClass)
procedure MyStatic;
procedure MyVirtual; override;
end;
Вот объясните мне разницу переопределенных функций в классе потомка. MyStatic ведь заменяет процедуру базового класса, точно также как и MyVirtual. Или я что-то путаю? И в каких случаях надо добавлять директиву reintroduce.
← →
Джо © (2005-08-06 20:11) [1]Честно говоря, не хочется растолковывать букварь. Вот тебе пример, запусти его и проследи за поведением. И не помешала бы, все-таки, книжка.
unit Unit2;
interface
uses Dialogs;
type
TBaseClass = class
procedure MyStatic;
procedure MyVirtual; virtual;
end;
TNewBase = class (TBaseClass)
procedure MyStatic;
procedure MyVirtual; override;
end;
implementation
{ TBaseClass }
procedure TBaseClass.MyStatic;
begin
ShowMessage ("TBaseClass.MyStatic")
end;
procedure TBaseClass.MyVirtual;
begin
ShowMessage ("TBaseClass.MyVirtual")
end;
{ TNewBase }
procedure TNewBase.MyStatic;
begin
ShowMessage ("TNewBase.MyStatic");
inherited;
end;
procedure TNewBase.MyVirtual;
begin
ShowMessage ("TNewBase.MyVirtual");
inherited;
end;
end.
Тестируем так:
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
BaseClass: TBaseclass; // обрати внимание, что переменная - базового класса
begin
// обрати внимание, что создается экземпляр производного класса
BaseClass := TNewBase.Create;
try
BaseClass.MyStatic;
BaseClass.MyVirtual;
finally
BaseClass.Free;
end;
end;
← →
Peter1 (2005-08-07 02:09) [2]понял ;)
а то читал по книжке, и чего-то мудрено написано. не могут простым языком написать ;)
← →
Peter1 (2005-08-07 02:19) [3]еще тогда вопрос, это так сказать пример был модели ооп, полиморфизм там и все дела. но вопрос такой, зачем мне создавать таким образом экземпляр:
BaseClass := TNewBase.Create;
если можно объявить переменную производного класса и записать так:
var NewClass: TNewBase;
begin
NewClass := TNewBase.Create;
то есть какая выгода записывать так как вы показали, от той что я сейчас написал?
← →
Юрий Зотов © (2005-08-07 04:09) [4]> Peter1 (07.08.05 02:19) [3]
А вы попробуйте обоими способами. Разницу увидите сами.
← →
Kolan © (2005-08-08 00:53) [5]Пример:
Есть три класса"Круг"
"Квадрат"
"Треугольник"
и общий предок "Фигура". У предка "Фигура" есть методDraw
, который перекрывается в каждом наследнике.
Допустим задача:
Нарисовать"Круг"
"Квадрат"
"Треугольник"
.
Если делать как ты говоришь то будет так:var
Triangle: TTriangle;
Square: TSquare;
Circle: TCircle;
begin
Triangle := TTriangle.Create;
Square := TSquare.Create;
Circle := TCircle.Create;
try
Triangle.Draw;
Square.Draw;
Circle.Draw;
funally
Triangle.Free;
Square.Free;
Circle.Free;
end;
end;
Как видищь оч неудобно. А если обектов 1000...
Вариант 2var
Shapes: array[1..3] of TShape;
begin
Shapes[1] := TTriangle.Create;
Shapes[2] := TSquare.Create;
Shapes[3] := TCircle.Create;
try
for I := Low(Shapes) to High(Shapes) do
Shapes[I].Draw;
funally
{Нуи тд}
Смысл вот в чём. Если я обявил переменную типа класса предка, то все методы предка там точно будут даже если я создам сам не экземпляр предка, а допустим создам потомка(пример 2).
← →
evvcom © (2005-08-08 08:56) [6]А самое интересное, что когда пишешь логику работы с TShape, ты можешь даже не догадываться, какие еще фигуры в последствии можешь реализовать. А дописав потом еще какие-нибудь супер-пупер-навороченные фигуры и подключив модули к проекту, видишь, что они нормально работают без внесения каких-либо изменений в модуль с базовыми классами (при условии, что они изначально были правильно написаны)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.01 c