我正在使用C#中的一些泛型.我有一个抽象的泛型类:
public abstract class BaseClass<T> where T : Foo { }
Run Code Online (Sandbox Code Playgroud)
并且当其他类从基类继承时指定type参数.
我也试图为另一个需要存储其中一个基类的抽象类编写一些代码,但它不知道基类的参数(并且它不需要知道).在Java中,我可以简单地写:
protected BaseClass<?> myBaseClass;
Run Code Online (Sandbox Code Playgroud)
但在C#中,我坚持要给它一个类型参数.如果我将其声明为:
protected BaseClass<Foo> myBaseClass;
Run Code Online (Sandbox Code Playgroud)
我无法为其分配任何参数化值BaseClass
.
是否有解决方案来实现BaseClass<?>
C#的效果?显然有一些方法可以重构我的代码以避免需要,例如参数化所有使用的类BaseClass
,但这不太理想.任何帮助,将不胜感激!
为了在某种程度上匹配 Java 在 C# 中的行为,通常会在继承层次结构中放置一个附加的非泛型接口。
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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后IBaseClass
在需要的地方使用BaseClass<?>
:
IBaseClass myClass;
Foo f = myClass.GetValue();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
327 次 |
最近记录: |