Использование дженериков в абстрактных классах
Я работаю над абстрактным классом, где реализующий класс должен реализовать список 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 для создания списка, абстрактный type (ItemBase) не очень хорошо работает с методом .ToList(). Я пытаюсь сделать это уникальным?
Ответы
Ответ 1
Вам также нужно объявление в классе, чтобы узнать, какой тип 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
Ответ 2
- Вам нужно объявить тип 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; }
}
Ответ 3
Вам нужно сделать AbstractClass
generic
public class AbstractClass<T> {
...
}
public class Container : AbstractClass<Widgets> { ...
}
Ответ 4
-
Вам нужно отметить AbstractClass abstract
, потому что он содержит абстрактное свойство
-
Укажите общий тип в объявлении AbstractClass
-
Реализовать абстрактное свойство с помощью override
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; }
}
Ответ 5
Вам нужно определить 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; }
}
Ответ 6
Вам нужно указать тип абстрактного класса:
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; }
}
Ответ 7
Вам не хватает абстрактного ключевого слова для вашего класса AbstractClass, а также вам нужно добавить ключевое слово переопределения для свойства Items контейнера. Я даю пример кода, который будет работать наверняка.
namespace AbstractGeneric
{
public abstract class AbstractClass<T>
{
public int Id { get; set; }
public int Name { get; set; }
public abstract List<T> Items { get; set; }
}
public class Widgets
{
public int ID { get; set; }
public string Name { get; set; }
}
public class Container : AbstractClass<Widgets>
{
public override List<Widgets> Items { get; set; }
public Container()
{
Items = new List<Widgets>();
}
}
class Program
{
static void Main(string[] args)
{
Container c = new Container();
c.Items.Add(new Widgets() { ID = 1, Name = "Sample Widget 1" });
c.Items.Add(new Widgets() { ID = 2, Name = "Sample Widget 2" });
foreach (Widgets item in c.Items)
{
Console.WriteLine(item.ID + " : " + item.Name);
}
Console.ReadLine();
}
}
}
Ответ 8
Как я могу сделать, чтобы создать Фабрику общего абстрактного класса?
Что-то вроде кода ниже:
public class Factory
{
public AbstractClass<T> Create(enum enumParam)
{
return new Container(); //here has a compilation error -> Error: "Cannot implicitly convert type 'Container' to 'AbstractClass<T>'"
}
}