Это зависит от того, что вы подразумеваете под «ограничением». Среда выполнения не помешает вам создать подклассы того, что вам нравится, но есть несколько ошибок. (Хотя ваш ответ конкретно о UINavigationController, название и концепция больше, поэтому я рассмотрю более крупные проблемы.)
- В родительском классе могут быть переменные, помеченные
@private
, и дочерние классы не могут получить к ним доступ, в отличие от значения по умолчанию @protected
, которое доступно.
- Некоторые классы предназначены для создания подклассов (а большинство классов AppKit и UIKit -), но для других это крайне неразумно. Например, ключевые фундаментальные классы, такие как NSString, NSMutableArray и т. Д., На самом деле являются кластерами классов, то есть экземпляр класса может фактически быть одним из нескольких частных классов.
- Классы, которые предназначены для создания подклассов, обычно документируют ключевые методы, которые должны быть переопределены. Например, NSDictionary и NSMutableDictionary описывают несколько «примитивных» методов, которые вызывает каждый другой метод, поэтому переопределение 2 или 3 в каждом случае достаточно для изменения поведения без повторной реализации всего остального.
- Будьте предельно осторожны, чтобы вызывать реализацию родительского класса вашего переопределенного метода, если и когда это необходимо. Это может быть особенно важно в классах пользовательского интерфейса, которые часто имеют более сложное поведение, чем простые классы данных get / set.
В этом случае вы совершенно правы, что не пишете класс с нуля - это было бы Плохой Идеей ™. Если вы хотите изменить значение атрибута по умолчанию (поле?), Вы можете установить желаемое значение в инициализаторе после вызова инициализатора родителя. Однако, если вы сделаете это, убедитесь, что вы не теряете что-то в родительском классе, и всегда тщательно проверяйте.
Apple зарезервировала методы, которые начинаются с "_", для собственного использования, поэтому я бы повторил предостережение Марка о том, чтобы вообще не трогать их. Все остальное - честная игра, в пределах разумного конечно. : -)