你是否可以拥有一个类函数来创建一个类的实例:
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));
原因是有些命令将通过文本/脚本指定,并需要在运行时解析。
RegisterClass()
和GetClass()
(因为如果不在代码中使用类,则该类不可用)。分辨率当前基于类名作为输入,但这是旧风格,上述方法也采用自定义属性,当加载到字典时,将导致RTTI注册类,无法避免注册部分+使用字典方法,您可以有多个分辨率入口到命令。问题是构造函数/新问题(真的很愚蠢),感谢您对模式的输入。 - MX4399