我将CObject作为主要类,并将CRock,CDesk,CComputer派生自CObject。我想编写一个读取类枚举(可能像OBJECT_COMPUTER的整数)并返回特定类型的函数。
例:
function createObject( iType : Integer ) : CObject;
begin
case iType of
OBJECT_ROCK : Result := CRock.Create();
OBJECT_DESK : Result := CDesk.Create();
end;
end;
所以我可以这样使用它:myRock:= createObject(OBJECT_ROCK);
现在我的问题是返回的对象是主类的父类,并且我不能在'myRock'上使用Rock函数,除非将类型从CObject强制转换为'createObject(OBJECT_ROCK)'到CRock,并且我不想为每个对象拥有3个函数子类。有任何想法吗?提前致谢。
最佳答案
如果我理解正确,则可以使用抽象方法在基类上声明派生功能的框架,然后在每个派生类中重写并实现该方法。
type
CObject = class
procedure DoIt; virtual; abstract;
end;
CRock = class(CObject)
procedure DoIt; override;
end;
CDesk = class(CObject)
procedure DoIt; override;
end;
var
myRock: CObject;
begin
myRock := createObject(OBJECT_ROCK);
myRock.DoIt;
myRock.Free;
end;
在上面的示例中,对“ myRock”实例的“ DoIt”调用将被正确解析为该类的方法。
如果这完全相关,请阅读抽象方法here。