我有以下类定义:
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;
答案 0 :(得分:0)
我需要一个
BaseExample
的实例,它可以同时接收Example01
或Example02
个值。例如: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
- 返回表单,该表单由泛型类包装称之为通用表格。