2010-07-28 57 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