У меня проблема, которая заставляет меня чувствовать себя довольно глупым. В проекте hobby у меня есть std :: список указателей на класс интерфейса, которые указывают на различные конкретные реализации указанного интерфейса.Подсчет объектов без RTTI
Например, у меня есть следующий:
class Seafood ...
class Fishstick : public Seafood ...
class Squid : public Seafood ...
...
std::list<Seafood*> buffet;
Теперь, когда я мой буфет, населенный различными элементы из морепродуктов, я хочу, чтобы подсчитать количество Fishsticks я быть_наст доступный для просмотра, если больше нужно быть приказал с кухни.
Как я могу сделать это без RTTI или какой-либо коварной реализации? Я прочитал несколько статей, которые утверждают, что если вы захотите использовать RTTI, вы приближаетесь к ООП неправильно и/или ваше решение должно быть перепроектировано. Существуют ли какие-то шаблоны или другие решения, которые справляются с этой проблемой? Который я уверен, должен был всплыть много раз прежде.
Я думал о очевидности, которая является своего рода виртуальной функцией, но я не могу понять, как это сделать, не строя в дрянной версии RTTI, или некоторые знания о потомках в интерфейсе (CountIfFishstick/IsFishstick/Есть (тип)).
Редактировать: еще одна вещь, которая пришла на ум, заключалась в том, чтобы сохранить один список рыбных палочек, один список кальмаров и т. Д. Но это наверняка победит всю цель интерфейса/внедрения.
Как вы сказали, здесь присутствует небольшой запах кода: либо вы заботитесь о конкретных типах (что вам кажется), либо вам все равно (используйте интерфейс). Обратите внимание, что полиморфизм заключается не в возможности хранить их вместе в контейнере, а в том, чтобы иметь возможность использовать производные типы через фиксированный интерфейс (например, при вызове функций), поэтому вы можете захотеть сохранить их отдельно (для целей подсчета) и но использовать интерфейс или другие цели. –
Если вы абсолютно должны проверить тип переменной, чтобы определить ее характер, 'bool isFishstick = !! dynamic_cast (значение);' должно работать. Тем не менее, вы должны искать другие подходы к этой проблеме. –
На самом деле это довольно глупо, чтобы все испугались RTTI и т. Д. Запах не указывает на плохой дизайн, это указывает на то, что МОЖЕТ БЫТЬ плохим дизайном. В то время как полиморфизм - это то, что нужно обрабатывать то же самое, иногда необходимо, например, при подсчете конкретных типов, выкапывать в иерархию наследования. Выполнение этого, а не какого-либо другого свернутого предмета - это самый простой и лучший способ сделать это. –