我對Delphi中可用的虛擬構造函數沒有任何經驗。我考慮使用虛擬構建函數的類層次重置實例爲初始狀態是這樣的:使用虛擬構造函數重置爲初始狀態
A = class
end;
B = class(A)
end;
C = class(B)
end;
FooA = class
a_ : A;
constructor Create(inst : A); overload;
constructor Create; overload; virtual; abstract;
destructor Destroy; override;
function Bar : A;
end;
FooB = class(FooA)
b_ : B;
constructor Create; override;
constructor Create(inst : B); overload;
end;
FooC = class(FooB)
// ...
end;
{ FooA }
constructor FooA.Create(inst: A);
begin
inherited Create;
a_ := inst;
end;
destructor FooA.Destroy;
begin
FreeAndNil(a_);
inherited;
end;
function FooA.Bar : A;
begin
Result := a_;
a_ := nil;
// here comes the magic
Self.Create;
end;
{ FooB }
constructor FooB.Create;
begin
b_ := B.Create;
inherited Create(b_);
end;
constructor FooB.Create(inst: B);
begin
inherited Create(inst);
b_ := inst;
end;
{ FooC } // ...
var
fc : FooA;
baz : A;
begin
fc := FooC.Create;
baz := fc.Bar;
WriteLn(baz.ClassName);
FreeAndNil(baz);
FreeAndNil(fc);
ReadLn;
end.
是否有在本設計中出現任何問題/陷阱?這個簡單的例子就像一個魅力,但我覺得有點不自在調用構造函數(這不構造任何東西)這樣。
編輯:
我決定初始化一個有意義的名字移到法保護區,是什麼讓我感覺更好;-)
FooA = class
strict private
a_ : A;
strict protected
procedure SetInst; overload; virtual; abstract;
procedure SetInst(i : A); overload;
public
constructor Create;
destructor Destroy; override;
function Foo : A;
end;
爲什麼不重新將「創建」重命名爲「程序重置;虛擬」之類的東西?並稱之爲無處不在?這樣你就可以確定它正在做你想要的東西。 – himself 2010-12-07 14:40:57