Подтвердить что ты не робот

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

Я работаю над абстрактным классом, где реализующий класс должен реализовать список 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(). Я пытаюсь сделать это уникальным?

4b9b3361

Ответ 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>'"
   }
}