我希望能够在继承层次结构中编写一系列类。每个类必须有一个特定于该类的类型T的成员Foo。如果它是相关的,则此层次结构中的任何类都不会包含重复的Foo类。
我最初的想法是用泛型做到这一点。例如,
public class ExampleBase<T> where T: GenericType
{
public T Foo
{
get;
set;
}
}
public class ExampleChildOne<T> : ExampleBase<T> where T : GenericTypeTwo {}
public class ExampleChildLeaf : ExampleChildOne<GenericTypeLeaf> {}
public class GenericType {}
public class GenericTypeTwo : GenericType {}
public class GenericTypeLeaf : GenericTypeTwo {}
使用此代码,我可以编写var foo = new ExampleChildLeaf().Foo;
之类的内容。变量是我想要的类型,即GenericTypeLeaf。这很好。但是,我无法执行ExampleBase example = new ExampleChildLeaf();
之类的操作,因为ExampleBase
需要通用类型。我也无法ExampleBase<GenericType> example = new ExampleChildLeaf();
,因为ExampleChildLeaf
实际上并未延伸ExampleBase<GenericType>
。
我也尝试过一种非通用的方法来做到这一点。每个类都有自己的Foo,它具有正确的类型(因此一个将具有GenericType Foo,一个将具有GenericTypeLeaf Foo等)。这个问题是我不能用不同的一个覆盖一个Foo,因为类型不同。
因此。总而言之,我有什么方法可以在功能上做类似的事情吗?没关系,如果它有点复杂,因为这将是一个几乎不应该修改的库。我的目标是让最终用户在抽象出所有通用参数时轻松使用。
另外,我无法想出一个很好的方式来表达标题问题。我也很感激这方面的建议。谢谢!
答案 0 :(得分:1)
如果您需要ExampleBase example = new ExampleChildLeaf();
,可以通过创建一个不了解Foo
的非通用基类来实现,但仍可以使用其他功能(假设还有其他功能) )。这与Task
和Task<T>
的工作方式非常相似。
public class ExampleBase
{
//....
}
public class ExampleBase<T> : ExampleBase where T: GenericType
{
public T Foo
{
get;
set;
}
}