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

Вниз

Переопределение методов, я не понимаю   Найти похожие ветки 

 
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...

Вариант 2
var
 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.041 c
11-1106815076
Неуловимый Джо
2005-01-27 11:37
2005.09.11
strlist в ListBox


1-1124701636
Laymer
2005-08-22 13:07
2005.09.11
QuickReport


6-1116903419
Алексей_К
2005-05-24 06:56
2005.09.11
Upload файлов на сервер посредством CGI


6-1116836925
Uninstall
2005-05-23 12:28
2005.09.11
Переход с Indy 9 на Indy 10.


1-1124200063
newguest
2005-08-16 17:47
2005.09.11
Почему не создается объект ?