我有两个泛型基类。第二个泛型类对第一个类的参数有一个约束。通用参数和抽象类的泛型
abstract class FirstClass<T> {...}
abstract class SecondClass<U> where U : FirstClass {...}
这不起作用,因为FirstClass没有定义。所以我需要这样做。
abstract class FirstClass<T> {...}
abstract class SecondClass<U, T> where U : FirstClass<T> {...}
哪个有效。但是,这使得这些抽象类很难实现。
class SomeClass {...}
class MyFirstClass : FirstClass<SomeClass> {...}
class MySecondClass : SecondClass<MyFirstClass, SomeClass> {...}
这对我来说似乎是多余的,因为我指定了SomeClass两次。有没有办法以这样的方式声明它,使FirstClass中的T自动成为SecondClass的U.我真的很喜欢这个样子。
class SomeClass {...}
class MyFirstClass : FirstClass<SomeClass> {...}
class MySecondClass : SecondClass<MyFirstClass> {...}
虽然我怀疑这个确切的情况是可能的,是有一个更清洁做什么,我试图做的?
编辑
几个人都建议做一个IFirstClass接口。但是我的定义更接近这个。
class FirstClass<T>
{
public T MyObj { get; set; }
}
class SecondClass<U, T> where U : FirstClass<T>
{
U MyFirstClass { get; set; }
}
使用接口我无法从SecondClass访问MyFirstClass.MyObj。虽然我可以在IFirstClass上创建一个object T MyObj { get; set; }
,然后使用new
来隐藏它,但如果我这样做,silverlight会抛出绑定。
虽然我没有提到silverlight的问题,但这是一个silverlight项目。我不确定这是否会限制解决方案。 – cadrell0 2011-04-05 17:14:18
如果您尝试将WCF RIA Services的TypeOf编组为您的POCO类,它将限制解决方案,因为泛型不能作为WCF或WCF RIA服务公开(没有一些主要的解决方法)。 –
2011-04-05 17:17:19
您是否在使用任何有关FirstClass的特定信息?如果不是,我在这些情况下倾向于做的是使FirstClass 匹配一些IGenericFirstClass接口,然后将约束指定为IGenericFirstClass。它隐藏了U型依赖关系。 – 2011-04-05 17:18:32