Недавно, выполнив некоторые разработки для iPhone, я заметил интересный шаблон дизайна, который часто используется в iPhone SDK в отношении изменчивости объектов.
Кажется, что типичный подход заключается в определении неизменяемого класса NSFoo
, а затем из него наследуемого потомка NSMutableFoo
. Как правило, класс NSFoo
определяет члены данных, методы получения и операции только для чтения, а производные NSMutableFoo
добавляют операции установки и преобразования.
Будучи более знакомым с C ++, я не мог не заметить, что это кажется полной противоположностью тому, что я делал бы при написании того же кода на C ++. Хотя вы, конечно, могли бы воспользоваться этим подходом, мне кажется, что более кратким подходом является создание единого класса Foo
, пометка методов получения и операций только для чтения как функций const
, а также реализация изменяемые операции и сеттеры в одном классе. После этого вы получите изменчивый класс, но типы Foo const*
, Foo const&
и т. Д. Фактически являются неизменным эквивалентом.
Полагаю, мой вопрос в том, имеет ли смысл мой взгляд на ситуацию? Я понимаю, почему Objective-C делает вещи по-другому, но есть ли какие-то преимущества в двухклассовом подходе в C ++, которые я пропустил? Или я упускаю суть целиком?
Не слишком серьезный вопрос - больше для моего собственного любопытства, чем для чего-либо еще.