使用c#generic继承,而继承类类型

时间:2012-02-21 16:02:19

标签: c# generics inheritance

在C#中是可能的吗?

假设我有这个:

public class T : U
{
 ...
}

我想要这个:

public class A<T> : B<U>
{
...
}

所以我可以在我的代码中使用它:

B<U> x = new A<T>();

3 个答案:

答案 0 :(得分:2)

你不能完全像你写的那样,但你可以这样做:

public class A<T, U> : B<U> where T : U
{
   ...
}

然后再做

B<U> x = new A<T, U>();

答案 1 :(得分:1)

初始代码确实工作正常......虽然由于您使用的术语可能存在一些混淆......

我相信你写的代码可以更清楚地重写如下:

void Main()
{
    B<Foobar> x = new A<Wibble>();

}

// Define other methods and classes here
public class Foobar
{
}

public class Wibble : Foobar
{
}

public class B<U>
{
}

public class A<T> : B<Foobar>
{
}

需要注意的关键是,有时你在泛型参数的上下文中使用U,有时你将它用作具体的类。

以上代码与LINQPad编译的IL相同(

void Main()
{
    B<U> x = new A<T>();

}

// Define other methods and classes here
public class U
{
}

public class T : U
{
}

public class B<U>
{
}

public class A<T> : B<U>
{
}

只有最后两个类使用泛型参数,而最后一个类没有将U定义为泛型参数,因此它将其视为具体类。很难说这是否是你想要的,因为你没有告诉我们你想要什么,只是向我们展示了一些代码。我想可能你想要@Roy Dictus回答的两个通用参数解决方案,但你可能想要这个。很难说。 ; - )

我应该注意到,我将此答案部分归功于之前删除的答案。那个答案指出代码编译很好,这激发了我测试实际代码。遗憾的是,如果删除了答案,我就不能相信这个人的灵感。

谢谢大家。 Chris解决了我的问题,前提是我能够在T的构造函数中调用A<T>的构造函数:public class A<T>B<Foobar> {}我该怎么做? - jambodev 1分钟前

在这种情况下,T是一个通用参数,因此您必须告诉编译器T是绝对可构造的。为此,您需要约束T以确保它具有构造函数。然后你应该能够随时创建它的新实例(例如T foo = new T();

您当然不能像链接基类的构造函数一样调用构造函数,因为A不以任何方式从T派生,它只是在其泛型模式中使用类型为T的对象。

public class A<T> : B<Foobar> where T :new()
{
    public T MyInstance {get; set;}
    public A()
    {
        MyInstance = new T();
    }
}

void Main()
{
    B<Foobar> x = new A<Wibble>();
    Wibble y = ((A<Wibble>)x).MyInstance;
}

(此代码替换了我的第一个代码块中的等效方法)

请注意,y是在x的conscructor中创建的Wibble类型的对象。另请注意,我需要在访问之前强制转换x,因为B<Foobar>对通用类型Wibble的使用一无所知。

答案 2 :(得分:0)

目前还不完全清楚你要做什么(班级名称没有帮助,我的大脑正在与T级挣扎)。 Roy Dictus会回答你想要的,或者Chris的回答是你想要的吗?我以不同的方式解释了这个问题,就像这个

    public class MyBaseClass  {}

    public class MyClass : MyBaseClass {}

    interface IB<out T>{}

    public class B<T> : IB<T> { }

    public class A<T> : B<T>   {}

    static void Main(string[] args)
    {
        IB<MyBaseClass> myVar = new A<MyClass>();
    }

关键是interfaces support covariance, classes do not