Используя дженерики в абстрактных классах

Я работаю над абстрактным классом, где класс с реализацией должен реализовать список T. Проблема состоит в том, что это не работает:

public class AbstractClass
{
    public int Id { get; set; }
    public int Name { get; set; }

    public abstract List<T> Items { get; set; }
}

public class Container : AbstractClass
{
    public List<Widgets> Items { get; set; }
}

Я уверен, что существует очевидный ответ, который я пропускаю, и я знаю, что могу создать абстрактный тип, чтобы вставить список, но когда я использую свою команду Linq для создания списка, абстрактный тип (ItemBase) не играет приятно с.ToList () метод. То, что я пытаюсь сделать настолько уникальный?

20
задан thaBadDawg 1 March 2010 в 22:22
поделиться

6 ответов

Вам также необходимо объявление в классе, чтобы знать, что это за тип T :

public abstract class AbstractClass<T>
{
    public int Id { get; set; }
    public int Name { get; set; }

    public abstract List<T> Items { get; set; }
}

public class Container : AbstractClass<Widgets>
{
    public List<Widgets> Items { get; set; }
}

Вы также можете ограничить то, чем может быть T, например, скажем, что он должен реализовывать IWidgets :

public class AbstractClass<T> where T : IWidgets
33
ответ дан 29 November 2019 в 23:08
поделиться
  1. Вам нужно отметить AbstractClass abstract , потому что он содержит абстрактное свойство

  2. Укажите универсальный тип в AbstractClass объявление

  3. Реализовать абстрактное свойство с переопределением


public abstract class AbstractClass<T>
{
    public int Id { get; set; }
    public int Name { get; set; }

    public abstract List<T> Items { get; set; }
}

public class Container : AbstractClass<Widgets>
{
    public override List<Widgets> Items { get; set; }
}

3
ответ дан 29 November 2019 в 23:08
поделиться

Вам нужно сделать AbstractClass универсальным

public class AbstractClass<T> {
  ...
}

public class Container : AbstractClass<Widgets> { ...
}
5
ответ дан 29 November 2019 в 23:08
поделиться

Вам нужно указать тип в абстрактном классе:

public class AbstractClass<T>
{
    public int Id { get; set; }
    public int Name { get; set; }

    public abstract List<T> Items { get; set; }
}

public class Container : AbstractClass<Widgets>
{
    public List<Widgets> Items { get; set; }
}
1
ответ дан 29 November 2019 в 23:08
поделиться

Вам нужно определить T так

public class AbstractClass<T>
{
    public int Id { get; set; }
    public int Name { get; set; }

    public abstract List<T> Items { get; set; }
}

public class Container : AbstractClass<Widget>
{
    public List<Widgets> Items { get; set; }
}
2
ответ дан 29 November 2019 в 23:08
поделиться
  • Вам нужно объявить тип T.
  • Вам нужно объявить класс AbstractClass как абстрактный.
  • Вам необходимо использовать ключевое слово override.

Попробуйте следующее:

public class Widgets { }

public abstract class AbstractClass<T>
{
    public int Id { get; set; }
    public int Name { get; set; }

    public abstract List<T> Items { get; set; }
}

public class Container : AbstractClass<Widgets>
{
    public override List<Widgets> Items { get; set; }
}
9
ответ дан 29 November 2019 в 23:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: