假设我有一个抽象基类BaseTimeCollection
和至少一个从基类继承的具体类ConcreteTimeCollection
。
我希望我的基类可以从ICollection<T>
继承。
从ICollection<T>
继承需要我提供许多方法的实现,包括IEnumerable.GetEnumerator()
和IEnumerable<T>.GetEnumerator
。
我不想在BaseTimeCollection
中实现这些方法-相反,我希望在我的每个具体类中分别实现它们。
这就是我遇到麻烦的地方。GetEnumerator
方法需要显式声明,因为其中有两个名称相同但返回类型不同。
但是,似乎我将签名明确化之后,就不能再使用abstract修饰符了。本质上,我被迫在我的基类中实现GetEnumerator
方法。
public abstract class BaseTimeCollection : ICollection<Time>
{
abstract IEnumerator IEnumerable.GetEnumerator(); // compile error: The modifier 'abstract' is not valid for this item
abstract IEnumerator<Time> IEnumerable<Time>.GetEnumerator(); // compile error: The modifier 'abstract' is not valid for this item
}
public class ConcreteTimeCollection : BaseTimeCollection
{
IEnumerator IEnumerable.GetEnumerator()
{
// this is where I would like to provide my implementation for IEnumerable.GetEnumerator()
}
IEnumerator<Time> IEnumerable<Time>.GetEnumerator()
{
// this is where I would like to provide my implementation for IEnumerable<Time>.GetEnumerator()
}
}
GetEnumerator
方法的实现推迟到具体的类上? 最佳答案
通过让显式实现在抽象类中调用 protected 抽象方法,然后让子代实现这些抽象方法,可以轻松地将实现推迟到子类:
public abstract class BaseTimeCollection : ICollection<Time>
{
protected abstract IEnumerator IEnumerable_GetEnumerator();
protected abstract IEnumerator<Time> GenericEnumerable_GetEnumerator();
IEnumerator IEnumerable.GetEnumerator()
{
return IEnumerable_GetEnumerator();
}
IEnumerator<Time> IEnumerable<Time>.GetEnumerator()
{
return GenericEnumerable_GetEnumerator();
}
}
对不起,这个命名方案很糟糕...这是我能在清晨提出的最好的解决方案。
关于c# - 继承ICollection <T>的抽象基类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6860007/