具有通用参数和抽象类的generics

我有两个通用的基类。 第二个generics类对其第一个类的参数有约束。

abstract class FirstClass {...} abstract class SecondClass where U : FirstClass {...} 

这不起作用,因为没有定义FirstClass。 所以我需要这样做。

 abstract class FirstClass {...} abstract class SecondClass where U : FirstClass {...} 

哪个有效。 但是,这使得实现这些抽象类很难看。

 class SomeClass {...} class MyFirstClass : FirstClass {...} class MySecondClass : SecondClass {...} 

这对我来说似乎是多余的,因为我正在指定SomeClass两次。 有没有办法以这样的方式声明它,即FirstClass中的T自动为SecondClass的U. 我真的希望看起来像这样。

 class SomeClass {...} class MyFirstClass : FirstClass {...} class MySecondClass : SecondClass {...} 

虽然我怀疑这种确切的情况是可能的,但是有什么更清洁我要做的事情呢?

编辑

有几个人建议制作一个IFirstClass接口。 但我的定义更接近于此。

 class FirstClass { public T MyObj { get; set; } } class SecondClass where U : FirstClass { U MyFirstClass { get; set; } } 

使用接口,我无法从SecondClass访问MyFirstClass.MyObj。 虽然我可以创建一个object T MyObj { get; set; } object T MyObj { get; set; } 在IFirstClass上,然后使用new来隐藏它,如果我这样做,silverlight会在绑定中抛出一个契合。

如果你实际上正在使用FirstClass的generics类型参数(因为,从你的编辑,它听起来像你),那么不,你要找的是不可能的。 编译器不区分相关的类型参数和不相关的类型参数。

根据我的经验,最简单的方法是创建generics类的非generics接口。 当您需要在不知道generics类型的情况下转换为基类时,它也解决了这个问题。

 interface IFirstClass {...} abstract class FirstClass : IFirstClass {...} abstract class SecondClass where T : IFirstClass {...} 

创建FirstClass实现的接口。 然后,您可以将SecondClass约束到接口。