Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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...

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

Наверх




Память: 0.46 MB
Время: 0.01 c
2-1123621130
ronyn
2005-08-10 00:58
2005.09.11
Относительность месторасположения файла.


1-1124537780
Агент Х-СОМ
2005-08-20 15:36
2005.09.11
Отладка компонентов


3-1122892579
Киря
2005-08-01 14:36
2005.09.11
Можно ли сделать подтаблицы в DbGridEh и как?


1-1124737726
Yozch1
2005-08-22 23:08
2005.09.11
Сохранение данных в VirtualTreeView


14-1124230275
VEG
2005-08-17 02:11
2005.09.11
Поиск ветки





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