2010-11-05 146 views
1

我有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到CRock類型轉換'createObject(OBJECT_ROCK)',我不想每個子類有3個功能。有任何想法嗎?提前致謝。

+0

你可能來自C++,因爲你用C作爲類的前綴。在Delphi類中,前綴爲T(類型)。沒有參數的過程,函數,構造函數等不需要()。例如TRock.Create;另見風格指南:http://edn.embarcadero.com/article/10280 – Remko 2010-11-06 08:00:21

回答

7

如果我理解正確,您將在抽象方法的基類中聲明派生功能的骨架,然後在每個派生類中覆蓋並實現該方法。

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的閱讀中都是相關的。

1

像前面的例子一樣,而是像這樣。我們稱之爲遺傳,多態。

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;