powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос по List<T>
16 сообщений из 16, страница 1 из 1
Вопрос по List<T>
    #39159617
chronicler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. Подскажите, плиз, можно ли как-то реализовать нечто подобное:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
    public class BaseItem{}

    public class BaseItem1 : BaseItem{}
    public class BaseItem2 : BaseItem{}
    public class BaseItem3 : BaseItem{}

    public class BaseList
    {
        private List<BaseItem> _list;

        protected List<BaseItem> List
        {
            get { return _list; }
        }

        public BaseItem Metod1ToWorkWithList(string text){}
        public BaseItem Metod2ToWorkWithList(string text){}
        public BaseItem Metod3ToWorkWithList(string text){}
    }

    public class Item1List : BaseList
    {        
        public Item1List()
        {
            _list = new List<BaseItem1>();
        }
    }

    public class Item2List : BaseList
    {        
        public Item2List()
        {
            _list = new List<BaseItem2>();
        }
    }

    public class Item3List : BaseList
    {        
        public Item3List()
        {
            _list = new List<BaseItem3>();
        }
    }
...
Рейтинг: 0 / 0
Вопрос по List<T>
    #39159626
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос не очень понятен (а, точнее, отсутствует напрочь).

Если хрустальный шар не врет, вам нужно что-то типа
Код: c#
1.
2.
3.
4.
5.
    public class BaseList<T> where T: BaseItem
    {
      protected List<T> List { get; set; }

    }
...
Рейтинг: 0 / 0
Вопрос по List<T>
    #39159640
chronicler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Да, спасибо, работает. А как правильно называется тема, чтоб почитать более подробно? Универсальные классы? Шаблоны?
...
Рейтинг: 0 / 0
Вопрос по List<T>
    #39159662
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Generic types, универсальные типы, обобщенные типы (в разных переводах), дженерики (жаргон)
...
Рейтинг: 0 / 0
Вопрос по List<T>
    #39159803
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

+ generic type constraint (Ограничения параметров типа)

p.s. есть еще отличное ограничение where T : new, указывающее на то, что класс должен иметь конструктор по умолчанию, а вот задать ограничения на более сложный конструктор нельзя и это печально
...
Рейтинг: 0 / 0
Вопрос по List<T>
    #39159935
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, если уж на то пошло, возможно, если автору нужно просто несколько своих методов для обработки листа, достаточно будет просто сделать несколько методов расширения на IList<BaseItem>, а не городить кучу своих классов.
...
Рейтинг: 0 / 0
Вопрос по List<T>
    #39160585
chronicler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.ProНу, если уж на то пошло, возможно, если автору нужно просто несколько своих методов для обработки листа, достаточно будет просто сделать несколько методов расширения на IList<BaseItem>, а не городить кучу своих классов.

Много классов, потому что сущности разные. Каждая сущность - отдельный класс. Каждый список тоже отдельный класс в котором есть набор специфичных методов. Но есть методы, которые идентичны для всех классов-списков, поэтому такие методы хотелось вынести в базовый класс.


Если можно, подскажите, пожалуйста, еще один момент.

Допустим есть BaseEditor - базовый класс редактора списков и в нем объявлен объект базового класса списков:

Код: c#
1.
public BaseList <BaseItem> currentList = null;



Допустим у BaseEditor есть наследник для работы с Item1List:

Код: c#
1.
class EditorForItem1List : BaseEditor{}



Создаем экземпляр EditorForItem1List и передаем ему ранее созданный и заполненный экземпляр Item1List:
Код: c#
1.
BaseEditor editor = new EditorForItem1List(_item1List);



Можно ли теперь переданный экземпляр Item1List привести к BaseList (или видимо к TBaseItem<T>)?
То есть сделать что-то вроде:
Код: c#
1.
2.
3.
4.
5.
public EditorForItem1List(object sender)
{
    if (sender is Item1List)
        this.currentList = (Item1List<BaseItem1>)sender;
}
...
Рейтинг: 0 / 0
Вопрос по List<T>
    #39160587
chronicler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Можно ли теперь переданный экземпляр Item1List привести к BaseList (или видимо к BaseList <T>)?
...
Рейтинг: 0 / 0
Вопрос по List<T>
    #39160612
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем тут какое-либо приведение?
Если Item1List наследник BaseList и Item1 наследник BaseItem, то все будет работать без дополнительных приведений.

Ну или покажите более целостный код, а то из этих обрывков сложно в уме собирать картину.
...
Рейтинг: 0 / 0
Вопрос по List<T>
    #39160641
chronicler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
    public class BaseItem
    {
    }

    public class Item1: BaseItem
    {
    }

    public class BaseList <T> where T : BaseItem
    {
        public List<T> List { get; set; }
    }

    public class Item1List : BaseList<Item1>
    {
        public Item1List()
        {
            List = new List<Item1>();
        }
    }

    public class BaseEditor
    {
        public BaseList <BaseItem> currentList = null;
    }

    public class EditorForItem1List : BaseEditor
    {
        public EditorForItem1List(object sender)
        {
            InitializeComponent();

            if (sender is Item1List)
                this.currentList = (Item1List<BaseItem1>)sender;                              
        }
    }



Ошибка на строке this.currentList = (Item1List<BaseItem1>)sender;
"The non-generic type cannot be used with type arguments "
...
Рейтинг: 0 / 0
Вопрос по List<T>
    #39160651
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для начала: нет у тебя такого типа: Item1List<BaseItem1>, есть Item1List
...
Рейтинг: 0 / 0
Вопрос по List<T>
    #39160660
chronicler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Proдля начала: нет у тебя такого типа: Item1List<BaseItem1>, есть Item1List

Ок, но вот так объявить не получается:

public BaseList currentList = null;

В ответ Error: "Using the generic type 'BaseList<T>' requires 1 type arguments"
...
Рейтинг: 0 / 0
Вопрос по List<T>
    #39160662
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что типа BaseList у тебя тоже нет, есть BaseList<T>
...
Рейтинг: 0 / 0
Вопрос по List<T>
    #39160664
chronicler
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Верно, поэтому currentList объявлен как BaseList <BaseItem>
...
Рейтинг: 0 / 0
Вопрос по List<T>
    #39160763
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще раз - тип MyType и тип MyType<> - это абсолютно разные типы и друг к другу они не приводятся.
...
Рейтинг: 0 / 0
Вопрос по List<T>
    #39160834
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
  public class BaseItem
    {
    }

    public class BaseList<T> where T : BaseItem
    {
        public List<T> List { get; set; }
    }  

    public class BaseEditor<Item> where Item:BaseItem
    {
        protected BaseList<Item> currentList { get; set; }
    }

    public class EditorForItem1List<Item> : BaseEditor<Item> where Item : BaseItem
    {
        public EditorForItem1List(object sender)
        {
            //  InitializeComponent();

            if (sender is BaseList<Item>)
                this.currentList = (BaseList<Item>)sender;
        }
    }
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Вопрос по List<T>
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]