#c #polymorphism #rtti #typeid
#c #полиморфизм #rtti #typeid
Вопрос:
У меня есть фабрика, в которой есть магазины, работающие с несвязанными вещами. Некоторые магазины работают на личных автомобилях и производных от них классах ( легковые автомобили, внедорожники, мопеды), а другие работают на военных транспортных средствах и производных от них классах (танки, самолеты, подводные лодки ).
Этот вопрос относится к моему заводскому классу, который не заботится о том, что производится в цехах, но он предоставляет некоторые услуги, позволяющие убедиться, что нужные типы транспортных средств направляются в нужные цеха. т. Е., если Audi A4 появляется на погрузочной площадке, его необходимо идентифицировать как личный автомобиль и направить в личный автосервис.
Могу ли я сделать это без объявления типов транспортных средств, возможных в классе Factory?
Итак, более подробно о специфике кодирования на C , я подумал, что на моем заводе мог бы быть std::map<shop *, const std::type_info *>
контейнер, где std::type_info *
был предоставлен магазинами, и указывает на базовый класс транспортного средства (например, личный автомобиль или военная машина). Но … мне не удалось найти способ проверить, совпадает ли объект std::type_info
для объекта с кандидатом или производным от этого кандидата.
Если на Заводе были известны хотя бы базовые типы транспортных средств (персональный автомобиль и военный автомобиль), я знаю, как использовать dynamic_cast<>()
действие с указателями personal auto или military vehicle для проверки равенства типов или того, что один из них является производным от базового. Тем не менее, я надеюсь сделать фабрику как можно более общей.
Есть идеи?
Ответ №1:
Почему бы не позволить магазинам указывать, кто они такие? Создайте интерфейс, который должен реализовать каждый магазин, с методами, основанными на правилах типа
virtual bool CanBeShipped() const = 0;
virtual bool IsMilitary() const = 0;
таким образом, фабрика обладает только знаниями правил, которые ей необходимо реализовать.
Комментарии:
1. Для этого потребовалось бы, чтобы каждый магазин каким-то образом был осведомлен обо всех различных типах товаров, производимых всеми магазинами. т. Е. IsMilitary(), как вы предлагаете, требует, чтобы личный автосервис знал, что другие магазины производят военные товары.
Ответ №2:
На данный момент я полагаю, что нужный мне тип операции с объектами std::type_info невозможен.
Я думаю, что следующий лучший вариант — возложить ответственность за идентификацию на магазины. Магазины поддерживают таблицу конкретных произведенных продуктов и их идентификацию типа. например
std::list<const std::type_info *> productsMadeHere;
Магазины также предоставляют общий интерфейс, который фабрика может использовать для опроса магазина, если он принимает определенный тип.
Shop::isThisMadeHere(std::type_info * product_type );