Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
667 / 213 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
1

В чём смысл ограничения параметра типа базовым классом? Generics Base class constraint

10.03.2018, 16:03. Показов 943. Ответов 5
Метки нет (Все метки)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        public class A
        {
            public virtual void F() => Console.WriteLine("AAA");
        }
 
        public class B : A
        {
            public override void F() => Console.WriteLine("BBB");
        }
 
        public static void Main(string[] args)
        {
            Func(new A());
            Func(new B());
        }
C#
1
public static void Func<T>(T inst) where T : A => inst.F();
C#
1
public static void Func(A inst) => inst.F();
Результат в обоих случаях один и тот же.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.03.2018, 16:03
Ответы с готовыми решениями:

class и id в чем смысл?
Собственно в чем разница между class и id ? В каких случаях нельзя использовать class, а в каких id?

class classname; В чем смысл?
Доброго времени. Иногда встречается код типа: namespace Compiler { class Context; } ...

Invalid_argument не является базовым классом
Всмысле? Как так? В заголовочном файле определяю наследование своего исключения от...

Создать иерархию наследования с абстрактным базовым классом
Доброго времени суток! Помогите, пожалуйста, сделать: 2) Создать абстрактный базовый класс с...

__________________

Записывайтесь на профессиональные курсы С#-разработчиков‌
5
Эксперт .NET
7535 / 5026 / 1197
Регистрация: 25.05.2015
Сообщений: 15,313
Записей в блоге: 14
10.03.2018, 16:13 2
В первом случае возможно создать строгую типизацию и при этом знать, что T есть класс A или его наследник.
Во втором типизации нет.
1
667 / 213 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
10.03.2018, 16:17  [ТС] 3
Rius, под строгой типизацией подразумевается добавление дополнительных ограничений? Например каких-нибудь интерфейсов?

Добавлено через 28 секунд
C#
1
public static void Func<T>(T inst) where T : A, IInterface1, IInterface2 => inst.F();
0
Эксперт .NET
7535 / 5026 / 1197
Регистрация: 25.05.2015
Сообщений: 15,313
Записей в блоге: 14
10.03.2018, 16:17 4
Лучший ответ Сообщение было отмечено dailydose как решение

Решение

Понимается, что метод возвращает (когда возвращает не void) то, что указано в качестве T.
А не базовый класс A.
1
667 / 213 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
10.03.2018, 16:22  [ТС] 5
Цитата Сообщение от Rius Посмотреть сообщение
Во втором типизации нет.
Ну как же))
там ведь в качестве типа не object, а класс А.

Добавлено через 5 минут
Цитата Сообщение от Rius Посмотреть сообщение
Понимается, что метод возвращает (когда возвращает не void) то, что указано в качестве T.
А не базовый класс A.
Ага, теперь вроде бы понял.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        public static void Main(string[] args)
        {
            // Cannot implicitly convert type A B.
            B t1 = Func(new B()); // ошибка компиляции
 
            B t2 = FuncGeneric(new B());
        }
 
        public static A Func(A inst) => inst;
        public static T FuncGeneric<T>(T inst) where T : A => inst;
 
        public class A
        {
            public virtual void F() => Console.WriteLine("AAA");
        }
 
        public class B : A
        {
            public override void F() => Console.WriteLine("BBB");
        }
т.е. generic версия нужна, когда нужно сохранить тип, так получается?
0
Эксперт .NET
7535 / 5026 / 1197
Регистрация: 25.05.2015
Сообщений: 15,313
Записей в блоге: 14
10.03.2018, 16:26 6
Чтобы избежать ошибок с преобразованием типов.
Универсальные шаблоны (Руководство по программированию на C#).
С введением генериков ушла куча головной боли от использования Array.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.03.2018, 16:26

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Наследование интерфейса базовым классом и его наследниками
есть общий абстрактный класс и три наследника(наследуют по одному свойству, каждый наследник имеет...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.