假设我有一个抽象基类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/

    10-14 18:14