kni*_*ick 6 c# collections inheritance interface
假设我有一个抽象基类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()
}
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
有什么方法可以将GetEnumerator方法的实现推迟到具体类?
通过让显式实现在抽象类中调用受保护的抽象方法,然后让子级实现这些抽象方法,您可以轻松地将实现推迟到子类:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
抱歉这个糟糕的命名方案......这是我早上最好能想到的.