|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
Создание инстанса типа, который является generic16.10.2017, 20:02. Показов 9679. Ответов 19
Метки нет (Все метки)
Доброго времени суток. Скажите пожалуйста, я знаю, что мне не получится создать экземпляр класса T, где T - является generic параметром, к примеру, какого нибудь метода. Тоесть внутри этого метода, я не смогу создать инстанс типа T, если только не введу ограничение на
where T : new().А если у меня ограничение на какой-нибудь базовый класс Base, тоесть where T : Base, у которого конструктор имеет параметр, смогу ли я создавать экземпляры T?Компилятор ругается, но очень хотелось бы провернуть такую фишку...
0
|
|
| 16.10.2017, 20:02 | |
|
Ответы с готовыми решениями:
19
Использование byte[] как generic-типа Generic, определение типа переменной во время выполнения программы Объявление обобщённого типа (Generic) для стандартных целочисленных типов |
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
| 16.10.2017, 21:09 [ТС] | |
|
Cupko, все равно нельзя создать
0
|
|
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
||
| 16.10.2017, 21:40 [ТС] | ||
|
Cupko,
не...рефлекция...это долго, да и еще не статически типизировано Как же я скучаю по шаблонам C++...Спасибо, за ответы
0
|
||
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
| 16.10.2017, 21:46 [ТС] | |
|
Cupko, ну рефлексия - это всегда долго
Поэтому согласен с людьми Да и еще раз повторюсь: это не статически типизировано
0
|
|
|
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,424
|
|
| 17.10.2017, 06:55 | |
|
Bretbas, в C# такой фишки нэма. Тут получается, что если вы знаете сигнатуру конструктора, то вы знаете и тип, которым параметризировали класс. Соответственно, обобщение теряет всякий смысл.
Если есть ну очень острое желание, то можно, надышавшись клеем, сотворить коллекцию фабрик принимающих на вход object[] и выдающих конкретные объекты T. И искать нужную фабрику по параметру дженерика. Оно даст, что вам надо (хоть и обходным путём) и не использует рефлексию, что быстро. Но всё равно это - конина какая-то. ![]() Добавлено через 5 минут Помните, что параметризация дженериков в .NET происходит в рантайме, потому их возможности сильно ограничены и рядом не стояли с С++, где всё это происходит на этапе компиляции и у компилятора вся информация на руках и он может вытворять всякое непотребство.
0
|
|
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|||
| 17.10.2017, 08:20 [ТС] | |||
|
Usaga,
Но параметры конструктора object[] как то тоже не сильно типизированы![]() where). По крайней мере у Java так, мне кажется все тоже самое на C#. C++ в этом случае гораздо мощнее, он знает на этапе компиляции и выполнения о типе T все, и ничего не срезает при выполнении. Тоесть от std::vector<T> останется std::vector<T>, а из этого все вытекающие - латентная типизация, создание инстансов, передача неопределенного числа параметров строго типизированно и тд
0
|
|||
|
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
|
||||||
| 17.10.2017, 09:01 | ||||||
|
Bretbas, если вам нужен именно вызов конструктора с параметрами, то не сможете.
В одной конторе, где я работал было правило, по возможности избегать конструкторов с параметрами и писать метод типа "Initialize", которому параметры передаются для уже сконструированного объекта. Тогда, понятно, создание экземпляров объектов с нужными параметрами легко осуществлялось. Кликните здесь для просмотра всего текста
0
|
||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||||||||||
| 17.10.2017, 09:56 | ||||||||||||
|
В таком случае передавайте в метод фабрику, которая будет создавать нужный экземпляр:
0
|
||||||||||||
|
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
|
||||||
| 17.10.2017, 10:02 | ||||||
0
|
||||||
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|||||||
| 17.10.2017, 18:17 [ТС] | |||||||
|
kolorotur,
И под каждый тип своя фабрика Не, так не пойдет![]() Я просто хотел узнать, можно ли сделать что-то типо такого на C#: (код C++)
0
|
|||||||
|
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,424
|
|
| 17.10.2017, 18:41 | |
|
Bretbas, чем этот пример отличается от
new и простого конструктора конкретного класса?
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 17.10.2017, 18:52 | ||
|
В плюсах шаблоны — это по сути дела команды найти/заменить для компилятора, они существуют только в тексте программы. Компилятор их просто заменяет на соответствующие типы или перегрузки. В шарпе генерики — настоящие, они могут принимать в качестве типа-параметра даже такой, которого не существует на стадии компиляции, т.к. конкретный тип под указанный параметр генерируется на стадии выполнения. Потому и компилятор должен быть в состоянии дать гарантию, что после компиляции обобщенный тип или метод может работать с любым типом, подходящим под условия. Отсюда да, больше ограничений.
1
|
||
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
||
| 17.10.2017, 19:01 [ТС] | ||
|
Usaga,
Create фабрики Factory, создать любой тип T, который наследует от Base, причем тип T может иметь любой конструктор, с аргументами, или без, без разницы. Лишь бы public только былВ C# такой можно реализовать, но через рефлексию однозначно, что долго. Да и при передаче параметров в Create на C# будет скорее всего передаваться param object[], что будет не статически типизировано
0
|
||
|
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,424
|
||
| 17.10.2017, 19:07 | ||
new, но с меньшим количеством кода. Фабрика подразумевает какой-то особый процесс создания объекта. Но обобщённая фабрика что может сделать особого для каждого отдельно взятого типа класса?
0
|
||
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|||||||||||
| 17.10.2017, 19:13 [ТС] | |||||||||||
|
Usaga, Вы имеете ввиду зачем писать так:
0
|
|||||||||||
|
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,424
|
||
| 17.10.2017, 19:14 | ||
|
Хотя такое и может быть полезно. Если создаваемые типы имеют общего предка, через интерфейс которого вновь созданный объект будет конфигурироваться фабрикой как-то. Может в этом что-то и есть.
Добавлено через 32 секунды
0
|
||
|
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
|
|
| 17.10.2017, 19:15 [ТС] | |
|
Usaga,
0
|
|
| 17.10.2017, 19:15 | |
|
Помогаю со студенческими работами здесь
20
Создание инстанса ADOConnection
Создать объект generic типа Создание объекта в generic Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
|
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений.
9TO2GP2bpX4
a42b81fb172ffc12ca589c7898261ccb/
https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/
Слева синяя линия -. . .
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла:
Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
|
|
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-text-sdl3-c. zip
finish-text-sdl3-cpp. zip
|
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
|
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo
Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло.
Но на выплатах по больничным это. . .
|
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
|