Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как реализовать? [D5, WinXP]


harisma ©   (2008-11-04 13:45:00) 

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

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) но не повторяли реализацию этого метода, а работали с базовым методом?


harisma   (2008-11-04 14:54:00) [1]

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


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

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 перекрыть...


Наверх

Титульная страница Поиск, карта сайта Написать письмо