Конечно, вы можете, мне просто интересно, рационально ли так проектировать.
Я делаю клон прорыва и занимаюсь дизайном классов. Я хотел использовать наследование, хотя мне и не нужно, чтобы применить то, что я изучил в C ++. Я думал о дизайне класса и придумал что-то вроде этого:
GameObject -> базовый класс (состоит из элементов данных, таких как смещения x и y, и вектора SDL_Surface *
MovableObject: GameObject -> абстрактный класс + производный класс GameObject (один метод void move () = 0;)
NonMovableObject: GameObject -> пустой класс ... нет методов или членов данных, кроме конструктора и деструктора (по крайней мере, сейчас?).
Позже я планировал извлечь класс из NonMovableObject, например, Tileset: NonMovableObject. Мне просто интересно, часто ли используются «пустые» абстрактные классы или просто пустые классы ... Я замечаю, что, как я это делаю, я просто создаю класс NonMovableObject просто для категоризации.
Я знаю, что слишком много думаю о том, чтобы сделать прорывного клона, но я больше концентрируюсь не на игре, а на использовании наследования и разработке какой-то игровой среды.
источник
MovableObject
неNonMovableObject
может наследовать друг от друга, у них обоих есть местоположение; как таковые, они оба должны потребляться кодом, который, например, хочет направить цель монстра на объект, не обращая внимания на то, может ли этот объект двигаться или нет.В нем есть приложения на C #, такие как ammoQ, но в C ++ единственным приложением было бы, если бы вы хотели иметь список указателей NonMovableObject.
Но тогда я представляю, что вы будете уничтожать объекты с помощью указателя NonMoveableObject, и в этом случае вам потребуются виртуальные деструкторы, и это уже не будет пустой класс. :)
источник
Одна из ситуаций, в которой вы можете увидеть это, - это когда вы хотите, чтобы строго настроенная коллекция содержала гетерогенные типы. Я не говорю, что это отличная идея, это может указывать на слабую абстракцию или плохой дизайн, но это происходит. Как вы упомянули, это способ категоризации материала, который может быть полезен и совершенно полезен.
Например, вы хотите, чтобы коллекция содержала Кошек и Собак. В своем дизайне вы решаете, что у них много общего, поэтому используйте базовый класс Mamal и используйте этот тип в своей коллекции (например, List). Все хорошо. Затем вы решаете, что хотите добавить лягушек в свою коллекцию, но они не являются мамалками, поэтому одним из способов сделать это будет сделать лягушек и мамалок подклассом животных, но, возможно, вы не можете думать о том, что есть у лягушек и мамалок в Обычный, так что Животное остается пустым. Затем вы печатаете свою коллекцию с помощью Animal вместо Mamal, и все хорошо.
В реальной жизни я обнаружил, что даже если я рано или поздно создаю пустой базовый класс, некоторые функциональные возможности оказываются там, но бывают случаи, когда они существуют.
источник