泛型继承和字段声明(类<t>,其中T:class <t>)</t> </t>

时间:2014-11-13 20:33:32

标签: c# generics inheritance

我有以下类定义:

public abstract class BaseExample<T> where T : BaseExample<T>
{

    public abstract T Clone(T original);

}

及其遗产

public class Example01 : BaseExample<Example01>
{
    public override Example01 Clone(Example01 original)
    {
        return this; // not the actual implementation
    }
}

public class Example02 : BaseExample<Example02>
{
    public override Example02 Clone(Example02 original)
    {
        return this; // not the actual implementation
    }
}

如何使用类型或基类声明变量?由于以下声明无法编译:

private BaseExample<T> declarationA;
    private BaseExample<T>  declarationA;
    private BaseExample declarationB;

3 个答案:

答案 0 :(得分:0)

  

我需要一个BaseExample的实例,它可以同时接收Example01Example02个值。例如:BaseExample a = new Example01()

您不能 - BaseExample<Example01>BaseExample<Example02>是不同的类型。不存在任何类型的基本类型(object除外)。

假设您可以:

BaseExample a = new Example01();

a.Clone()的返回类型会返回什么?

如果您的代码在泛型类ot方法中,那么您可以:

public T MyMethod<T>(T value) where T : BaseExample<T>
{
    BaseExample<T> a = value;
    return value.Close();
}

但是你必须在调用方法时指定类型,例如

Example01 a1 = new Example01();
Example01 a2 = MyMethod(a1);  // MyMethod<Example01> is inferred by the compiler

答案 1 :(得分:0)

它不起作用,因为您为通用类型T指定的任何内容都不能BaseExample<T>

BaseExample<int>  declarationA;

如果int以上BaseExample<int>不能真正int BaseExample<int>!= {{1}})

答案 2 :(得分:0)

如前所述,由于Generic<T1>Generic<T2>是不同的类,因此您无法将它们分配给同一个变量。

我解决这个问题的一种方法是使用非泛型基类,例如

public abstract class BaseExample { ... }
public abstract class BaseExmmple<T> : BaseExample
    where T : BaseExample<T>
{ ... }

通过实施internal abstract成员可以使这更安全,这样外部类就无法实现BaseExample

如果您希望能够从非泛型类型的变量中保存的对象中调用.Clone(),您应该实现一个object - 返回表单,该表单由泛型类包装称之为通用表格。