クラスのインスタンスを作成するクラス関数を持つことができます:Delphiでインスタンスを作成するクラス関数
TMyClass = class(TSomeParent)
public
class function New(AValue : integer) : TMyClass;
end;
TDerivedClass = class(TMyClass)
public
function Beep;
end;
...
var
myList : TList<T>;
item : TDerivedClass;
begin
myList.Add(TDerivedClass.New(1))
myList.Add(TDerivedClass.New(3))
myList.Add(TDerivedClass.New(5))
for item in myList do
item.Beep; //times the count in the class function
...
もしそうなら、その関数コードはどのように見えますか? TObjectのNewInstanceメソッドを使用し、派生クラスごとに毎回再実装しますか?コンストラクタを使用する方が安全かどうかですか?
これは、コマンド・パターンでこのアプローチを使用し、クラス・タイプとレシーバーを持つコマンド・リストをロードすることです。//FYI: document is an instance of TDocument
commandList.Execute(TOpenDocument(document));
commandList.Execute(TPasteFromClipboard(document));
//... lots of actions - some can undo
commandList.Execute(TPrintDocument(document));
commandList.Execute(TSaveDocument(document));
これは、いくつかのコマンドがtext /実行時に解決する必要があります。
Createではなく、Newをコンストラクターと呼ぶ理由はなく、仮想である必要はありません。 –
@Rob:クラス変数を使って構築するときに、コンストラクタをオーバーライドする理由があります。私はCreateがはるかに優れた名前であることに同意します。 New()は、クラス関数の名前としてNew()が与えられている質問に関連するものです。 – dmajkic
仮想コンストラクタはクラス参照変数が使用されている場合にのみ有効ですが、仮想コンストラクタが必須*でないことは事実です。仮想コンストラクタは、子孫クラスでオーバーライドする必要がある場合にのみ必要です。それは他の仮想メソッドの使用と変わりません。この質問は、子孫が基本クラスとは異なる構築動作を必要とすることを示すものではありませんでした(別のクラスを構築する以外は自動ですが)。 –