интерфейсы: Foo
Причина: ваш код не должен знать, что он имеет дело с интерфейсом. Написание «IFoo» делает именно это. Вместо этого Foo ясно дает понять, что 'Foo' является общим, и объект за ним может быть 'NumFoo' или 'StrFoo'. Код действительно не нужно заботиться.
абстрактные классы: AbstractFoo
Причина: ваш код никогда не будет использовать этот класс напрямую. Вы всегда будете создавать подклассы этого класса для создания любых классов, которые используются другим кодом. Поэтому программисту должно быть совершенно ясно, что класс является абстрактным. И как лучше назвать его Абстрактным!
В местах, где вам нужно использовать ссылки типа AbstractFoo, вы должны вместо этого пересмотреть использование интерфейса. (Конечно, это не возможно в C ++)
Перечисления: FooType или FooEnum. Лично FooType лучше, потому что Type легче относится к «реальному миру», который делает Enum.
Ура!