我正在使用 C# 中的一些泛型。我有一个抽象泛型类:
public abstract class BaseClass<T> where T : Foo { }
其他类继承基类时指定类型参数。
我也在尝试为另一个需要存储这些基类之一的抽象类编写一些代码,但它不会知道基类的参数(而且它不需要知道)。在 Java 中我可以简单地写:
protected BaseClass<?> myBaseClass;
但在 C# 中,它坚持要我给它一个类型参数。如果我将其声明为:
protected BaseClass<Foo> myBaseClass;
我无法分配 BaseClass
的任何参数化值
是否有解决方法来实现 BaseClass<?>
的效果?在 C# 中?显然有一些方法可以重构我的代码以避免这种需要,例如参数化所有使用 BaseClass
的类。也一样,但这不太理想。任何帮助将不胜感激!
最佳答案
为了在某种程度上与 C# 中的 Java 行为相匹配,通常在继承层次结构中放置一个额外的非泛型接口(interface)。
public interface IBaseClass
{
Foo GetValue();
void SetValue(Foo value);
}
public abstract class BaseClass<T> : IBaseClass
where T : Foo
{
public T GetValue<T>()
{ /* ... */ }
public void SetValue<T>(T value)
{ /* ... */ }
Foo IBaseClass.GetValue() // Explicit interface method implementation
{
return (Foo)GetValue<T>();
}
void IBaseClass.SetValue(Foo value) // Explicit interface method impl.
{
SetValue<T>((T)value);
}
}
然后使用IBaseClass
你需要的地方BaseClass<?>
:
IBaseClass myClass;
Foo f = myClass.GetValue();
关于C# 等价于 Java 的 GenericType<?>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21142571/