Как использовать производный тип в универсальной коллекции из абстрактного класса (C #)? - PullRequest
0 голосов
/ 01 августа 2011

У меня есть общая коллекция, которая содержит метод, который необходимо вызвать элементам в коллекции. Каждый элемент имеет ссылку на общую коллекцию. Проблема в том, что я не могу использовать тип каждого элемента в качестве типа, передаваемого в общую коллекцию.

Идея такая (я знаю, она не компилируется):

    public class MyCollection<T>
    {
        public void Call(T item) { ... }
    }

    public abstract class MyItemBase
    {
        protected MyCollection<typeof(this)> _collection;
        public MyItem(MyCollection<typeof(this)> collection)
        {
            this._collection = collection;
        }

        public DoSomething()
        {
            this._collection.Call(this);
        }
    }

    public class MyItem : MyItemBase
    {
    }

Очевидно, вы не можете объявить MyCollection<typeof(this)>, но я думаю, что, написав это так, вы получите общее представление о том, что я пытаюсь сделать. По сути, я хочу, чтобы ссылка абстрактного класса на коллекцию была означает MyCollection<MyClass>.

Есть ли способ заставить эту работу?

1 Ответ

1 голос
/ 01 августа 2011

Прежде всего, почему ваш класс ItemBase содержит ItemCollection?Разве не должно быть наоборот, где ваш класс Collection должен содержать Items?

Однако для вашего проблемного контекста вы можете быть безопасными с точки зрения типов, если разрабатываете свой класс следующим образом:

 public class MyCollection<T> where T : MyItemBase<T>
{
    public void Call(MyItemBase<T> item) { }
}

public abstract class MyItemBase<T> where T : MyItemBase<T>
{
    protected MyCollection<T> _collection;

    protected MyItemBase(MyCollection<T> collection)
    {
        _collection = collection;
    }

    public void DoSomething()
    {
        _collection.Call(this);
    }
}

public class MyItem : MyItemBase<MyItem>
{
    public MyItem(MyCollection<MyItem> Collection)
        : base(Collection)
    {
    }
}
...