【问题标题】:Function returning class derivates函数返回类导数
【发布时间】:2010-11-05 17:52:46
【问题描述】:

我有 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);

现在我的问题是返回的对象是主类父类,如果没有将 CObject 类型转换为 CRock 的“createObject( OBJECT_ROCK )”,我不能在“myRock”上使用 Rock 函数,我不想拥有 3每个子类的功能。有任何想法吗?提前致谢。

【问题讨论】:

  • 您可能来自 C++,因为您使用 C 为类添加前缀。在 Delphi 中,类以 T(类型)为前缀。没有参数的过程、函数、构造函数等不需要 ()。例如 Trock.Create;另请参阅样式指南:edn.embarcadero.com/article/10280

标签: delphi class function


【解决方案1】:

如果我理解正确,您将使用抽象方法在基类上声明派生功能的骨架,然后在每个派生类中覆盖并实现该方法。

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

【讨论】:

    【解决方案2】:

    和前面的例子一样,但更像这样。我们称之为继承、多态。

    type
      TcObject = class
        procedure DoIt; virtual; abstract;
      end;
    
      TcRock = class(CObject)
        procedure DoIt; override;
      end;
    
      TcDesk = class(CObject)
        procedure DoIt; override;
      end;
    
    
    var
      myRock: TcObject;
    begin
      myRock := TcRock.Create;  //Inherits from TcObject and instantiate TcRock class.
      myRock.DoIt; //Will automaticall call TcRock.Doit --Polymorphism
      myRock.Free;
    end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-04
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 2014-02-20
      • 1970-01-01
      相关资源
      最近更新 更多