8 / 8 / 3
Регистрация: 20.05.2012
Сообщений: 174
1

Обобщённые интерфейсы. Привидение к единому типу

30.06.2015, 14:16. Показов 425. Ответов 0
Метки нет (Все метки)

Доброго времени суток форумчанам.

Я пока не силён в наследовании и обобщениях, посему прошу помощи.

Для начала, попробую на словах предать суть проблемы...
У меня есть некоторые классы среди которых есть коллекции, которые лежат в разных ветках наследования (все классы - дети одного общего).
Причём, некоторые коллекции могут содержать в себе различные элементы, а некоторые только определенного типа.
Отсюда, хотелось бы сделать обобщённый интерфейс для коллекций, т.к. в т.ч. хотелось бы их пихать в ячейку таблицы DataTable (или нельзя так?), да и в некоторых коллекциях выборку по типу было бы делать удобнее.

Я попробовал сделать тип ячейки - типом обобщённого интерфейса с типом родителя этих классов, но в таком случае, экземпляры добавляться отказываются, выдавая несоответствие типов, либо null-значения при приведении.

Вот примерный код:
Кликните здесь для просмотра всего текста


Само действо с таблицей
C#
1
2
3
4
5
6
7
8
9
10
11
12
DataTable table = new DataTable();
 
            table.Columns.Add(new DataColumn("Some", typeof(ICollectionInterface<AbstractMainType>)));
 
            DataRow dRow = table.NewRow();
            dRow.SetField<ICollectionInterface<AbstractMainType>>("Some", new InterfaceMakerFirst() as ICollectionInterface<AbstractMainType>);
            table.Rows.Add(dRow);
 
            foreach (var row in table.AsEnumerable())
            {
                Console.WriteLine(row.Field < ICollectionInterface<AbstractMainType>>("Some").SomeDoing());
            }

Иерархия наследования

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
44
45
46
47
48
49
interface ICollectionInterface<TSome> where TSome : AbstractMainType
        {
            string SomeDoing ();
        }
 
        class AbstractMainType
        {
 
        }
 
        class FirstInterfaceType : AbstractMainType
        {
 
        }
        class SecondInterfaceType : AbstractMainType
        {
 
        }
        class ThirdType_NotCollection : AbstractMainType
        {
 
        }
 
        class InterfaceMakerFirst : ICollectionInterface<AbstractMainType>
        {
 
            #region Члены ICollectionInterface<FirstInterfaceType>
 
            public string SomeDoing ()
            {
                return "Вызван метод первого класса";
            }
 
            #endregion
        }
 
 
        class InterfaceMakerSecond : ICollectionInterface<SecondInterfaceType>
        {
 
            #region Члены ISomeInterface<SecondInterfaceType>
 
            public string SomeDoing ()
            {
                return "Вызван метод второго класса";
            }
 
            #endregion
        }

Правильно ли я понимаю, что в таких случаях, необходимо реализовывать обычный интерфейс, наследуемый от обобщённого и уже в DataTable пихать экземпляры его типа или у меня где-то ошибка в наследовании/обобщении?

Подскажите, пожалуйста
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.06.2015, 14:16
Ответы с готовыми решениями:

Обобщённые интерфейсы и классы
Здравствуйте, прошу помочь разобраться в следующем вопросе, у меня есть обобщённый класс class...

Интерфейсы. Выделить у классов общий интерфейс(или интерфейсы)
Задание: У классов выделить общий интерфейс ( или интерфейсы ). первый класс : using...

Привидение типов
1) Вот этот фрагмент кода echo (float)$var; выводит тип float. Есть подобная ф-я, которая бы...

Привидение типов
Как можно привести string к TDBLookupComboboxEh? Я хочу сделать, чтобы в цикле, вывел текст...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.06.2015, 14:16
Помогаю со студенческими работами здесь

Явное привидение указателей
Здравствуйте! Столкнулся с проблемой нужно явно привести указатель типа int к типу float...

Явное привидение типа
Здравствуйте. Столкнулся с такой странностью, переменной discount присваиваю выражение и оно почему...

Привести телефон к единому шаблону
Есть номер телефона в таком виде 9004567456, нужно получить строку вот такого вида (900) 456-74-56,...

Привидение Матрицы к треугольному виду ?
В matlab есть функция rref(a) в описании сказано что она приводит матрицу к треуголному виду. Но...

Привести футер к единому виду
Все доброго времени суток! Есть такой сайт. На главной и на странице Каталог футер растянут на...

Номер телефона привести к единому шаблону
Есть номер телефона в таком виде 9004567456, нужно получить строку вот такого вида (900) 456-74-56,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru