|
0 / 0 / 0
Регистрация: 20.07.2015
Сообщений: 89
|
||||||||||||||||
Как реализовать получение компонента26.08.2021, 03:49. Показов 1594. Ответов 5
Метки нет (Все метки)
Здравствуйте.
Есть базовый класс Component<T> в который, при наследовании передаю тип производного класса, чтобы потом кешировать в переменную. Далее в контейнере я кеширую интерфейс IGetComponent, чтобы потом вытащить производный компонент. Я не знаю, как связать метод GetComponent и его интерфейс, чтобы он возвращал тип Т. Я не хочу, использовать в качестве возвращаемого типа object и потом его приводить к Т, так как систему нужно сделать максимально производительной, поэтому лишние апкасты ни к чему. Я прошу Вашей помощи, помочь мне решить эту проблему.
0
|
||||||||||||||||
| 26.08.2021, 03:49 | |
|
Ответы с готовыми решениями:
5
Работа с почтой: как реализовать получение писем
Как реализовать получение данных из двух чисел |
|
148 / 92 / 56
Регистрация: 03.02.2021
Сообщений: 284
|
|
| 27.08.2021, 05:30 | |
|
Может быть Т можно как-то можно ограничить? Каким-нибудь базовым классом. В каких целях это создается? Что это будет?
0
|
|
|
0 / 0 / 0
Регистрация: 20.07.2015
Сообщений: 89
|
|
| 27.08.2021, 16:59 [ТС] | |
|
Идея вот в чем, любой компонент наследует класс Component<T>, где T один из типов производного класса, который будет ключом для поиска этого компонента в контейнере.
Это нужно для некой стандартизации и оптимизации. К примеру лазерный луч взаимодействует с игроком и кубом. Для этого я создаю базовый класс, который я буду искать в контейнере игрового объекта - LaserBeamTarget. Его уже наследуют классы игрока (LaserBeamPlayer) и куба (LaserBeamCube). И там, через переопределения я пищу индивидуальную логику этих объектов. Соответственно мне нужно как-то привести LaserBeamTarget и другие подобные классы к общему виду, чтобы я мог их положить в словарь и вытянуть напрямую нужный тип (а не через апкаст). Для этого я и написал интерфейс IGetComponent. Т и так ограничен, он должен наследоваться от Component<T>.
0
|
|
|
Модератор
|
|||||||||||||
| 28.08.2021, 13:28 | |||||||||||||
<T>?
Почему не так?
Да и какая-то бессмыслица с методом GetComponent.Он возвращает сам объект. Зачем такой метод?
0
|
|||||||||||||
|
0 / 0 / 0
Регистрация: 20.07.2015
Сообщений: 89
|
||||||
| 28.08.2021, 15:15 [ТС] | ||||||
|
Вот +/- рабочий пример.
У меня есть объекты, которые состоят из контейнеров и компонентов, которые кэшируются в контейнер. Далее есть системы, которые должны взаимодействовать с этими объектами. Для этого, для них созданы базовые компоненты. А уже каждый объект при необходимости расширяет эти базовые компоненты. Так вот, при кешировании, я передаю компонент с расширенной логикой. Однако, внутри контейнера, я вытягиваю его базовый тип, который является ключом для поиска компонента в контейнере. Таким образом, базовый тип определен на момент постройки иерархии компонентов, для чего я и передаю Т в Component<T>. Чтобы элементарно, мне вручную этого каждый раз не делать при кешировании + защита на дурака. Сейчас в контейнере при кешировании, я сохраняю компонент в тип object. Соответственно, когда я пытаюсь вытащить базовый компонент происходит апкаст, чего я и пытаюсь избежать в примере, который указан в этом вопросе. Компилятор не дает сохранить T в словарь, либо IGetComponent<T>, поэтому я и пытаюсь сохранить ссылку на базовый компонент в Component<T> и через интерфейс пытаться его вытащить.
0
|
||||||
|
Модератор
|
|
| 29.08.2021, 10:51 | |
|
urbemAngeli, смущает ваш термин "кеширование".
Как я понял под ним вы подразумеваете какую-то коллекцию. Коллекция эта создаётся при объявлении типов - так как обобщённый параметр должен быть известен ДО компиляции. Если в этой коллекции будут разные типы, то она должна быть типизирована их общим предком. Типизация object - применяется когда все эти типы могут найти общего предка только на уровне object. Допустим, вы создали некий базовый тип ComponentContent без свойства Content.К нему создали производные типы ComponentContent<T>, в которых есть свойство Content обобщённого типа.И вам надо их собрать в общую коллекцию ComponentsContainer.Вы её можете типизировать только базовым классом (или интерфейсом): ComponentsContainer: Collection<ComponentContent>.И при работе с элементами этой коллекции вам всё равно придётся приводить их к производному типу так как по другому не получится обратить к членам объявленным в производном типе. В каком случае имеет смысл создание базового типа. Если у базового есть какие-то члены которые могут быть реализованы одинаковыми для всех производных или которые могут быть переопределены в производных, но использование их общее для всех типов. Элементарный пример. Базовый класс "животное" с общим для всех членом "вес" и виртуальным действием по умолчанию при внезапном обнаружении. Производный тип "волк" с действиями "укусить" и "выть". В нём действие по умолчанию переопределено на вызов "укусить". Производный тип "заяц" с действиями "драпать" и "рыть нору". В нём действие по умолчанию переопределено на вызов "драпать" . Вы собираете коллекцию животных. И описываете "лес". В нём при встрече животных, вызываете базовый метод действия по умолчанию. Производные типы сами вызовут нужный их метод. Но если нужно вызвать действие специфичное для данного животного (например, "выть" для волка), то базовый тип необходимо сначала привести к производному. Тоже самое для ваших компонентов. Если есть общие члены, то чтобы использовать их без приведения к производным типам они должны быть объявлены в базовом. Если такое невозможно, то вам не избежать приведения к производным типам.
0
|
|
| 29.08.2021, 10:51 | |
|
Помогаю со студенческими работами здесь
6
DatetimePichker (Как реализовать запись в БД данных с этого компонента) Как реализовать FindNext в FindDialog для компонента RichEdit? Mdaemon (как реализовать отправку и получение) Как реализовать быстрое получение команд с сервера с SIM900? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Отправка уведомления на почту при изменении наименования справочника
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. Данные берутся из. . .
|