Как хранить объекты в List<T>? С#

354
15 сентября 2017, 18:30

У меня есть абстрактный класс Izdanie, от которого наследуются классы Kniga и Journal. От Kniga наследуется класс Uchebnik.

Как мне правильно прописать List чтобы в нем можно было хранить объекты всех этих классов (Кроме абстрактного, само собой)? И как прописать вызов. Чтобы иметь возможность иметь доступ к полям и вызывать методы.

P.S. метод прописан в абстрактном классе и переопрелеляется в дочерних классах.

Answer 1

Как мне правильно прописать List чтобы в нем можно было хранить объекты всех этих классов

Просто объявляете List для базового класса и всё. Тогда в него можно будет размещать объекты любого из классов наследников.

И как прописать вызов. Чтобы иметь возможность иметь доступ к полям и вызывать методы. P.S. метод прописан в абстрактном классе и переопрелеляется в дочерних классах.

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

В крайнем случае никто не запрещает объявить List для конкретного наследника или, на худой конец, привести типы.

Answer 2

Объявление будет вида:

public void SomeMethod<T>(List<T> IzdList) where T : Izdanie

Пример использования:

class Program
{
    public static void ShowDescriptions<T>(List<T> IzdList) where T : Izdanie
    {
        foreach (var izdanie in IzdList)
            Console.WriteLine(izdanie.GetDescription());
    }
    static void Main(string[] args)
    {
        List<Izdanie> listIzdanie = new List<Izdanie>();
        Kniga k1 = new Kniga();
        k1.name = "Книга 1";
        k1.publisher = "Издатель 1";
        k1.year = 2017;
        listIzdanie.Add(k1);
        Uchebnik u1 = new Uchebnik();
        u1.name = "Учебник 1";
        u1.publisher = "Издатель 2";
        u1.year = 2016;
        u1.author = "Автор 1";
        listIzdanie.Add(u1);
        ShowDescriptions(listIzdanie);
    }
}
public abstract class Izdanie
{
    public string name { get; set; }
    public string publisher { get; set; }
    public int year { get; set; }
    public virtual string GetDescription()
    {
        return "Name: " + this.name + " Published: " + this.publisher + " in " + this.year.ToString();
    }
}
public class Kniga : Izdanie
{
    public override string GetDescription()
    {
        return "Name: " + this.name + " Published: " + this.publisher;
    }
}
public class Uchebnik : Izdanie
{
    public string author { get; set; }
    public override string GetDescription()
    {
        return "Name: " + this.name + " Published: " + this.publisher + " Author: " + this.author;
    }
}
READ ALSO
Поставить условие в Repeater

Поставить условие в Repeater

ЗдравствуйтеПосле обработки данных на сервере данные выводятся в Repeater, который выглядит следующим образом:

338
Премещение кнопки при наведении мыши на кнопку

Премещение кнопки при наведении мыши на кнопку

Как можно при наведении мыши на кнопку перемещать ее (так же, только еще в обратную сторону нужно)? Этот код криво справляетсяТ

293
Привязка button к Int

Привязка button к Int

У меня есть две кнопки в DataTemplateНужно привязать их к свойству типа int так, что бы по нажатию одной кнопки переменная увеличивалась, по другой...

323
Можно/нужно ли делать сервисы бизнес логики одиночками (Singleton) или статическими?

Можно/нужно ли делать сервисы бизнес логики одиночками (Singleton) или статическими?

Например у меня есть сервисы ScannerService и UsersServiceПервый отвечает за управление сканером на устройстве, второй получает данные из базы данных...

264