C # полиморфизм в универсальных типах - PullRequest
5 голосов
/ 11 ноября 2010
class Base
{}

class Sub : Base
{}


void AddNewBase(Base t, LinkedList<Base> list){ ... }
...
{

    Sub asub = new Sub();

    LinkedList<Sub> asubList = new LinkedList<Sub>();
    AddNewBase(asub,asubList) // doesn't work
}

В основном, у меня есть пользовательская функция вставки, которая берет новый элемент и список, чтобы вставить его, и выполняет некоторую сортировку, чтобы найти хорошее место, чтобы поместить его в список.

Проблема в том, что я хочу сделать это, основываясь на свойствах в Base, поэтому было бы хорошо иметь только одну функцию, которая могла бы делать это для всех списков подтипов.

Я думаю, что мне нравитсяof want is:

static void AddNewBase<T>(T t, LinkedList<T> list){ ... }

, но с некоторым пояснением T, например: 'где T - подкласс Base'

Ответы [ 3 ]

9 голосов
/ 11 ноября 2010

Вы можете объявить Ограничения на параметры типа :

static void AddNewBase<T>(T t, LinkedList<T> list) where T : Base { ... }
0 голосов
/ 11 ноября 2010

В C # 4 вы можете использовать ковариацию, чтобы сделать эту работу.Вы должны выбрать один из ковариантных универсальных интерфейсов коллекции.Например, переопределение вашего метода как:

static void AddNewBase(Base t, IEnumerable<Base> list) { //... }

Позволит вам вызвать AddNewBase с LinkedList<Sub>.

0 голосов
/ 11 ноября 2010

Вы можете использовать ключевое слово где таким же образом, и вам не нужен универсальный тип.

Вот реализация IComparable, которая, вероятно, является тем, что вы могли бы искать в классической задаче сортировки:

    static void AddNewBase<T>(T t, LinkedList<T> list) where T : IComparable
    {
        //
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...