Текущий архив: 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