2010-07-28 79 views
4

可以說我有2個類類型TEmployee(具有屬性A,B)和TDept(具有屬性C,D)。然後,我從做後裔的TList像這樣一類:訪問通用類型的成員

TMyCcontainer<T>=class(TList<T>) 

所以我可以創建TMyCcontainer的情況,並參照TEmployee或TDept填寫。在我的TMyCcontainer類中,是否有訪問TEmployee的屬性A,B或TDept的屬性C,D的方法?

當然,這種類型是通用的,所以它不會顯示。這就是我一直對泛型的問題 - 也許我錯誤地使用它們。我最近學會了abaout約束,並認爲我已經發現了我已經失蹤....

所以我創建了2個接口,說IEmployee和IDept,使我的2 orig類es是interfaceobjects,並把我的contraint我TLIST即

TMyCcontainer<T:IEmployee,IDept>=class(TList<T>) 

當然,我很快就失望了,因爲這是說你必須實現在任何類型的我把我一般從TList(TMyContainer)這些接口的,而我只是想ONE在任何特定實例在另一個例子中是另一個。我將不得不在我的TDept類中實現IEmployee和IDept,這不是我想要的obv。

有沒有什麼好的方法來訪問泛型容器中的類型的成員?或者我不應該使用泛型來做這種事情。 Ty

回答

4

你放在一個類上的所有通用約束都必須由泛型完成。看起來你真正想要的是兩種不同的通用類型:TMyContainer<TDept>TMyContainer<TEmployee>。然後,您可以單獨訪問這些類型的所有屬性。 Ty Mason,

+1

Ty Mason。我一直在做一些完全愚蠢的事情 - 試圖把代碼放到TMyContainer中,並以某種方式訪問​​那裏的屬性,儘管T的類型是未知的。我相信我應該爲每個我想放入TMyContainer的已知類型創建另一個來自TMyContainer的類,從而使我能夠訪問類型屬性並同時維護我的代碼的封裝。 – csharpdefector 2010-07-28 15:38:03

+0

@Csharpdefector:是的,確切地說。 – 2010-07-28 15:39:50

+0

如果屬性聲明爲已發佈,或者如果您使用啓用了擴展RTTI的D2010 +,則可以使用RTTI訪問屬性,而無需派生單獨的類。 – 2012-06-13 23:00:01