[英]Abstract base class that inherits ICollection<T>
假设我有一个抽象基类BaseTimeCollection
和至少一个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
方法的实现推迟到具体类?
通过让显式实现在抽象类中调用受保护的抽象方法,然后让子级实现这些抽象方法,您可以轻松地将实现推迟到子类:
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();
}
}
抱歉这个糟糕的命名方案......这是我早上最好能想到的。
没有必要显式地实现两个版本的GetEnumerator来防止名称冲突,所以除非另外要求它们都是显式的,否则你可以使泛型方法隐式,这样它也可以是抽象的。 然后,根据@supercat,非泛型方法可以调用泛型方法。
public abstract class BaseTimeCollection<Time> : ICollection<Time>
{
public abstract IEnumerator<Time> GetEnumerator(); // implicit, generic and abstract
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
// Other ICollection methods (Add, Clear, etc) ...
}
首先:你得到的编译错误是什么?
你需要你的基类,也许你可以使用另一个界面,如:
public interface BaseTimeCollection : ICollection<Time> {}
然后让你的实现实现该接口而不是你的基类,或者你有一些共同的功能?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.