2011-04-05 72 views
14

我有两个泛型基类。第二个泛型类对第一个类的参数有一个约束。通用参数和抽象类的泛型

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会抛出绑定。

+0

虽然我没有提到silverlight的问题,但这是一个silverlight项目。我不确定这是否会限制解决方案。 – cadrell0 2011-04-05 17:14:18

+0

如果您尝试将WCF RIA Services的TypeOf 编组为您的POCO类,它将限制解决方案,因为泛型不能作为WCF或WCF RIA服务公开(没有一些主要的解决方法)。 – 2011-04-05 17:17:19

+0

您是否在使用任何有关FirstClass的特定信息?如果不是,我在这些情况下倾向于做的是使FirstClass 匹配一些IGenericFirstClass接口,然后将约束指定为IGenericFirstClass。它隐藏了U型依赖关系。 – 2011-04-05 17:18:32

回答

4

如果你实际上使用FirstClass的泛型类型参数(就像你编辑的那样,听起来像你一样),那么不,你要找的东西是不可能的。编译器不区分相关的类型参数和不相关的类型参数。

+1

这就是我的想法,但如果我们没有希望,我们会有什么? – cadrell0 2011-04-05 17:52:10

+0

@ cadrell0:careers.stackoverflow.com;)尽管如此,不要忘记接受这些答案之一。这几乎是你唯一的选择。 – 2011-04-05 18:21:10

10

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

interface IFirstClass {...} 

abstract class FirstClass<T> : IFirstClass {...} 

abstract class SecondClass<T> where T : IFirstClass {...} 
+0

请看我的编辑。我还没有遇到需要投入基类的问题。 – cadrell0 2011-04-05 17:29:08

2

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