Переопределение универсального интерфейса IEnumerable в дочернем классе - PullRequest
2 голосов
/ 21 марта 2011

Я занимаюсь разработкой ORM. Я хочу, чтобы объекты моей коллекции можно было использовать в Linq. Занятия, которые я здесь написал, упрощены для ясности. Массив, содержащий объекты сущностей, находится в классе CollectionBase.

class EntityBase
{
    public int fieldBase;
}

class EntityChild : EntityBase
{
    public int fieldChild;
}

class CollectionBase : IEnumerable<EntityBase>
{
    protected EntityBase[] itemArray;

    //implementing the IEnumerable<EntityBase> is here. GetEnumerator method returns IEnumerator<EntityBase>

}

class CollectionChild : CollectionBase, IEnumerable<EntityChild>
{
    public CollectionChild()
    {
        itemArray = new EntityChild[5]; //this is just an example.
    }
    //implementing the IEnumerable<EntityChild> is here. GetEnumerator method returns IEnumerator<EntityChild
}

Я попробовал несколько вещей.

Если CollectionChild не расширяет IEnumerable, собственные поля EntityChild не могут быть доступны в этом коде:

var list = from c in childCollection
where c.fieldChild == 1; // c references to an EntityBase object.
select c;

Если CollectionChild расширяет IEnumerable, даже невозможно использовать CollectionChild в Linq.

Произошла ошибка: «Не удалось найти реализацию шаблона запроса для типа источника« Generic_IEnumerableSample.CollectionChild ».« Где »не найдено. Рассмотрим явное указание типа переменной диапазона« childCollection ».»

Я попытался найти способ наследовать класс (в CollectionBase, который реализует IEnumerator) в CollectionChild как класс IEnumerator. Это не сработало, потому что невозможно переопределить методы, которые возвращают разные перечислители.

Все еще возможно не реализовать интерфейс IEnumerator для базового класса коллекции, а реализовать для всех дочерних классов коллекции. Но похоже, что это не аплодисменты OODesign.

Должен ли я изменить свой дизайн, или есть ли способ полностью переопределить методы или эффекты IEnumerable?

1 Ответ

2 голосов
/ 21 марта 2011

Настройте свой класс следующим образом:

public class CollectionBase<T> : IEnumerable<T>
  where T: EntityBase
{
    protected EntityBase[] itemArray;

    //implementing the IEnumerable<EntityBase> is here. GetEnumerator method returns IEnumerator<EntityBase>

}

Таким образом, базовый класс будет знать базовый тип.

HTH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...