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

Вниз

Как реализовать?   Найти похожие ветки 

 
harisma ©   (2008-11-04 13:45) [0]

Есть следующее объявление классов:

type
 TObjectBase = class(TObject)
 ...
 protected
   function  CreateMeanClass: TObjectBase; virtual; abstract;
 end;

 TObject_1_1 = class(TObjectBase)
 ...
 end;

 TObject_1_2 = class(TObject_1_1)
 ...
 public
   function  CreateMeanClass: TObject_1_1;
 end;

 ...  // Еще N - 1 объявлений подобных пар классов

 TObject_N_1 = class(TObjectBase)
 ...
 end;

 TObject_N_2 = class(TObject_1_1)
 ...
 public
   function  CreateMeanClass: TObject_N_1;
 end;

 TDesignerBase = class(TObject)
 ...
 protected
   procedure InternalMethod1(AObj1, AObj2: TObjectBase); virtual; abstract;
   procedure InternalMethod2(AObj1, AObj2: TObjectBase); virtual; abstract;
   ...
 end;

 TDesigner_1 = class(TDesignerBase)
 ...
 protected
   procedure InternalMethod1(AObj1, AObj2: TObjectBase); override;
   procedure InternalMethod2(AObj1, AObj2: TObjectBase); override;
 public
   procedure SomeMethod;
   ...
 end;

 ... // Еще N - 1 объявлений подобных классов

 TDesigner_N = class(TDesignerBase)
 ...
 protected
   procedure InternalMethod1(AObj1, AObj2: TObjectBase); override;
   procedure InternalMethod2(AObj1, AObj2: TObjectBase); override;
 public
   procedure SomeMethod;
   ...
 end;


Реализация метода SomeMethod у каждого из классов TDesigner_i практически одинаковая, с одним лишь отличием, что в каждом из классов используется своя пара объектов типа TObject_i_1 и TObject_i_2. Вот реализация метода SomeMethod для класса TDesigner_i:

procedure TDesigner_i.SomeMethod;
var
 LObj1: TObject_i_1;
 LObj2: TObject_i_2;
 LMS: TMemoryStream;
begin
 LObj2 := TObject_i_2.Create;
 try
   LObj1 := LObj2.CreateMeanClass;
   try
     LMS := TMemoryStream.Create;
     try
       InternalMethod1(LObj1, LObj2);
       InternalMethod2(LObj1, LObj2);
     finally
       FreeAndNil(LMS);
     end;
   finally
     FreeAndNil(LObj1);
   end;
 finally
   FreeAndNil(LObj2);
 end;
end;


Поскольку код метода практически идентичен для всех классов, я хочу у базового класса TDesignerBase реализовать этот метод, перенеся в него указанный выше код, а из дочерних классов его выбросить.

Как переписать этот метод на уровне базового класса так, чтобы дочерние классы работали со экземплярами своих классов (TObject_i_1  и TObject_i_2) но не повторяли реализацию этого метода, а работали с базовым методом?


 
jack128_   (2008-11-04 14:34) [1]

TDesignerBase = class(TObject)
...
protected
  procedure InternalMethod1(AObj1, AObj2: TObjectBase); virtual; abstract;
  procedure InternalMethod2(AObj1, AObj2: TObjectBase); virtual; abstract;
  function CreateObject_i_2: TObjectBase; virtual; abstract;
  ...
end;

procedure TDesignerBase.SomeMethod;
var
LObj1: TObjectBase;
LObj2: TObjectBase;
LMS: TMemoryStream;
begin
LObj2 := CreateObject_i_2();
try
  LObj1 := LObj2.CreateMeanClass;
  try
    LMS := TMemoryStream.Create;
    try
      InternalMethod1(LObj1, LObj2);
      InternalMethod2(LObj1, LObj2);
    finally
      FreeAndNil(LMS);
    end;
  finally
    FreeAndNil(LObj1);
  end;
finally
  FreeAndNil(LObj2);
end;
end;


и соответственно каждый наследник TDesignerBase должен не весь SomeMethod переписывать, а только CreateObject_i_2 перекрыть...


 
harisma ©   (2008-11-04 14:54) [2]

Ну, что-то в этом есть :) Попробую.
Может еще какие будут мнения?



Страницы: 1 вся ветка

Текущий архив: 2009.11.22;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.018 c
2-1254729868
Virgo_Style
2009-10-05 12:04
2009.11.22
Взаимодействие с программой из открытого браузером html-документа


15-1253610696
Вася
2009-09-22 13:11
2009.11.22
Распаковать gz


15-1253568604
Юрий
2009-09-22 01:30
2009.11.22
С днем рождения ! 22 сентября 2009 вторник


1-1225211215
leonidus
2008-10-28 19:26
2009.11.22
Кодирование кириллицы для использования в URL


15-1253561708
Anatoly Podgoretsky
2009-09-21 23:35
2009.11.22
Если у кого есть немного свободного времени