Здравствуйте, l33thaxor, Вы писали:
L>Поэтому и спрашиваю про альтернативы.
Альтернатив, видимо, и нет.
Возможность расширения или хотя бы версионности нужно закладывать в протоколах
изначально, попытки сделать это в более поздних стадиях обречены.
O>>В COM (Windows) этот вопрос решили следующим образом — все классы наследуются от O>>абстрактного IUnknown, который имеет метод QueryInterface для запроса интерфейсов.
L>Не вижу принципиальной разницы между QueryInterface и dynamic_cast применительно для данной задачи.
QueryInterface маскирует получение целевого объекта — это может быть указатель this,
либо копия всего объекта, либо вообще какой-нибудь прокси. И время его жизни контролируется
подсчетом ссылок, что в некоторых ситуациях может устранить путаницу.
А RTTI связан с накладными расходами на ровном месте и вообще плохо переносим.
L>>>Есть ли другие варианты?
O>>Такой, к примеру: O>>...
L>Это, конечно, фигня, а не вариант. SomeFunction не может сама создать объекты классов реализующих эти интерфейсы, потому как она не знает, какие классы их реализуют, и как их создавать.
Это лишь сильно упрощенный пример. Классы могут создаваться фабриками, заворачиваться во
всякие обертки для обеспечения совместимости интерфейса, и так далее.
Хотя плохой дизайн это все равно не спасет.