Индивидуальный список в C # - PullRequest
       17

Индивидуальный список в C #

2 голосов
/ 25 сентября 2011

Я хочу создать настраиваемый список в c #. В моем настраиваемом списке я хочу создать только настраиваемую функцию Add (T), остальные методы должны остаться без изменений.

Когда я делаю:

public class MyList<T> : List<T> {}

Я могу переопределить только 3 функции: Equals, GetHashCode и ToString.

Когда я делаю

public class MyList<T> : IList<T> {}

Я должен реализовать все методы.

Спасибо

Ответы [ 5 ]

6 голосов
/ 25 сентября 2011

Когда я делаю публичный класс MyList: IList {}

Я должен реализовать все методы.

Да, но это просто ... просто отправьте вызов исходной реализации.

class MyList<T> : IList<T>
{
    private List<T> list = new List<T>();

    public void Add(T item)
    {
        // your implementation here
    }

    // Other methods

    public void Clear() { list.Clear(); }
    // etc...
}
2 голосов
/ 25 сентября 2011

Вы можете иметь MyList для внутреннего вызова List<T> реализации, за исключением Add (T), вы бы использовали Состав объекта вместо Наследование классов , что такжев предисловии к книге GOF : «Пользу» для композиции объекта »над« наследованием класса »."(Банда четырех 1995: 20)

1 голос
/ 25 сентября 2011

Вы можете сделать еще одну вещь, используя ключевое слово new:

public class MyList<T> : List<T> 
{
   public new void Add(T prm) 
   {
       //my custom implementation.
   }
}

Плохо : То, что вы ограничены в использовании только типа MyList. Ваш настроенный Add будет вызываться только в том случае, если используется MyList тип объекта. * * 1010

Хорошо : С этим простым кодом вы сделали:)

0 голосов
/ 25 сентября 2011

Используйте private List<T> вместо наследования и реализуйте свои методы так, как вам нравится.

РЕДАКТИРОВАТЬ: чтобы получить MyList зацикливается на foreach, все, что вам нужно, это добавить GetEnumerator() метод

0 голосов
/ 25 сентября 2011

Вы можете использовать шаблон декоратора для этого.Сделайте что-то вроде этого:

public class MyList<T> : IList<T>
{
    // Keep a normal list that does the job.
    private List<T> m_List = new List<T>();

    // Forward the method call to m_List.
    public Insert(int index, T t) { m_List.Insert(index, t); }

    public Add(T t)
    {
        // Your special handling.
    }
}
...