Подскажите по ООП

_IUnknown
Дата: 28.04.2011 22:14:25
Доброй ночи господа!
Возник вопрос по принципам ООП, попробую объяснить на надуманном примере.
Есть базовый класс (TForm1), в нем есть функция (ReturnForm) возвращающая некий класс (пусть это будет тоже TForm1)
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
    function ReturnForm: TForm1; virtual;
  end;
Так же есть дочерний класс
  TForm2 = class(TForm1)
  private
    { Private declarations }
  public
    { Public declarations }
    function ReturnForm: TForm2; reintroduce;
  end;
так вот мне надо в дочернем переопределить тип возвращаемого результата функцией ReturnForm.
Сделать то получилось, с помощью директивы reintroduce и кода
function TForm2.ReturnForm: TForm2;
begin
  Result := TForm2(inherited ReturnForm);
end;
но что-то подсказывает мне что это не совсем правильно. Собственно вопрос и состоит правильно ли это? и если нет, то как правильно?
DimaBr
Дата: 29.04.2011 00:46:04
Это будет правильным лишь в том случае, если функция первого класса ReturnForm: TForm1 создаст форму второго класса, типа
function TForm1.ReturnForm: TForm1;
begin
  Result := GetCurrentClassForm.Create(Application) as TForm1;
end;
DetSimen
Дата: 29.04.2011 05:38:18
а принцип ООП говорит, чтоб определить

function ReturnForm: TCustomForm;

и возвращать в разных классах потом все что угодно

Result:=Self;
fd00ch
Дата: 29.04.2011 11:38:39
DetSimen, и потом задолбаться с приведением типов. Зато сделать как в учебнике...
Anatoly Podgoretsky
Дата: 29.04.2011 11:43:40
Программист должен работать, а не отмазки искать.
Хитрый руский программист, булька кушать хочет, а работать нет.
DetSimen
Дата: 29.04.2011 11:54:32
fd00ch: во-первых, вопрос был по принципам ООП, т.е по учебнику. Во-вторых пример слишком надуманный, чтоб по нему давать более осмысленные ответы.
_IUnknown
Дата: 29.04.2011 12:38:09
fd00ch
DetSimen, и потом задолбаться с приведением типов. Зато сделать как в учебнике...

Вот именно поэтому и хочу переопределить тип возвращаемого значения функцией. Задалбывает приведение типов от класса скелета к дочерним "рабочим" классам.
Т.е. Ситауция такая (продолжая надуманный пример): TForm1 ничто иное как TCustomReference, а функция в этом скелете возвращает TCustomEditor, но вот уже в наследнике TCustomReference я хочу получать результатом не TCustomEditor, а его определенного наследника дабы не морочиться с приведением типов.
Вот хотел узнать насколько правильный избранный мной метод, чтобы не стыдно потом было исходник публиковать.
__Avenger__
Дата: 29.04.2011 12:42:32
_IUnknown,

Нормальный подход, так все девки написаны.
__Avenger__
Дата: 29.04.2011 12:47:50
Только непонятно зачем здесь reintroduce.

  // Базовый класс
  protected
    function GetFormOwner: TForm;
  public
    property FormOwner: TForm read GetFormOwner;

  // Потомок
  protected
    function GetFormOwner: TformTemplateGrid;
  public
    property FormOwner: TformTemplateGrid read GetFormOwner;

function TformClientAdd.GetFormOwner: TformTemplateGrid;
begin
  Result := TformTemplateGrid( inherited GetFormOwner )
end;
_IUnknown
Дата: 29.04.2011 13:21:42
Спасибо всем большое, вроде разобрался.
__Avenger__
Спасибо за пример!
а если функция с директивой virtual? Я так понимаю в этом случае все же нужно использовать reintroduce, чтобы компилятор не орал?