![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как реализовать? [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 перекрыть...