2010-03-22 73 views
3

請原諒以下代碼示例的詳細程度。用Delphi 2009年,我創建了兩個類TOtherClass和TMyClass:德爾福:RTTI爲2010年索引屬性?

TOtherClass = class(TObject) 
public 
    FData: string; 
end; 

TMyClass = class(TObject) 
private 
    FIndxPropList: Array of TOtherClass; 
    function GetIndxProp(Index: Integer): TOtherClass; 
    procedure SetIndxProp(Index: Integer; Value: TOtherClass); 
public 
    property IndxProp[Index: Integer]: TOtherClass read GetIndxProp write SetIndxProp; 
end; 

與作爲

function TMyClass.GetIndxProp(Index: Integer): TOtherClass; 
begin 
    Result := self.FIndxPropList[Index]; 
end; 

procedure TMyClass.SetIndxProp(Index: Integer; Value: TOtherClass); 
begin 
    SetLength(self.FIndxPropList, Length(self.FIndxPropList) + 1); 
    self.FIndxPropList[Length(self.FIndxPropList) - 1] := Value; 
end; 

實現訪問說明它的使用可以說明如下:

procedure Test(); 
var 
    MyClass: TMyClass; 
begin 
    MyClass := TMyClass.Create; 
    MyClass.IndxProp[0] := TOtherClass.Create; 
    MyClass.IndxProp[0].FData := 'First instance.'; 
    MyClass.IndxProp[1] := TOtherClass.Create; 
    MyClass.IndxProp[1].FData := 'Second instance.'; 
    MessageDlg(MyClass.IndxProp[0].FData, mtInformation, [mbOk], 0); 
    MessageDlg(MyClass.IndxProp[1].FData, mtInformation, [mbOk], 0); 
    MyClass.IndxProp[0].Free; 
    MyClass.IndxProp[1].Free; 
    MyClass.Free; 
end; 

不要介意這個「設計」的明顯缺陷。我意識到我希望能夠通過RTTI訪問IndxProp屬性,並隨後將IndxProp移至已發佈部分。非常令人失望的是,我發現在已發佈部分中不允許使用索引屬性。據我瞭解(見Barry Kellys在How do I access Delphi Array Properties using RTTI的評論),轉向D2010不會讓我做到這一點。

在另一方面,以下是從Robert Loves blog報價:「...的屬性和方法現在都可以通過RTTI在公共和出版部,和領域所有可用的部分的。」 (我的斜體)

我的問題是這樣的:如果在D2010中有可能獲得公共字段的RTTI,那麼我的原始示例(如上所示)不應該在D2010中工作嗎?提前致謝!

回答

2

是的,如果所有屬性讀取器都是索引到數組字段或列表類字段中,則可以使用RTTI直接將字段索引到字段中。然而,這種方式很脆弱,因爲它打破了你的封裝,要求你編寫代碼到特定的實現細節,而不是一般的原則,這是RTTI主要的優點。您的RTTI代碼必須與您班級的確切結構相匹配,如果它發生變化,您還必須更改代碼。這種做法違背了使用RTTI的目的。

但是,如果沒有替代方案可用,由於數組屬性對它們沒有RTTI,所以至少現在它可能是唯一的方法。

編輯:更新此答案。對索引屬性的支持已添加到XE2中的擴展RTTI系統。 (但是,由於無關的穩定性問題,您可能需要等待XE3 ...)

+0

謝謝,梅森。我會馬上安裝D2010。 :) – conciliator 2010-03-22 11:48:42

+0

很高興我能幫到你。 – 2010-03-22 12:22:53

+0

更新:Delphi XE2引入了'TRttiIndexedProperty',它提供了獲取索引屬性的運行時類型信息的功能。 – menjaraz 2012-04-10 05:54:48