Предположим, у меня есть абстрактный базовый класс BaseTimeCollection
и хотя бы один конкретный класс ConcreteTimeCollection
, который наследуется от базового класса.
Я бы хотел, чтобы мой базовый класс наследовал от ICollection<T>
.
Наследование от ICollection<T>
требует от меня предоставления реализаций для ряда методов, включая IEnumerable.GetEnumerator()
и IEnumerable<T>.GetEnumerator
.
Я не хочу реализовывать эти методы в BaseTimeCollection
- вместо этого я бы предпочел реализовать их индивидуально в каждом из моих конкретных классов.
Здесь я сталкиваюсь с неприятностями.
Методы GetEnumerator
должны быть объявлены явно, потому что есть два из них, оба с одинаковым именем, но с разными типами возврата.
Однако, похоже, что как только я сделаю подпись явной, я больше не могу использовать абстрактный модификатор. По сути, я вынужден реализовать метод 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
до конкретных классов?