Как далеко вы можете пойти, используя подклассы в target-c? - PullRequest
1 голос
/ 11 июня 2009

В приложении для iPhone мне нужно настроить внешний вид класса UINavigationController. Например, увеличьте размер панели и размер шрифта. Мой клиент действительно нуждается в этом, а также большие кнопки.

Итак, вместо того, чтобы писать класс с нуля, я решил создать подкласс UINavigationController. У меня вопрос, могу ли я настроить любой метод или значение атрибута по умолчанию? Есть ли какие-либо ограничения при создании подкласса класса?

Ответы [ 2 ]

2 голосов
/ 11 июня 2009

Это зависит от того, что вы подразумеваете под «ограничением». Среда выполнения не помешает вам создать подклассы того, что вам нравится, но есть несколько ошибок. (Хотя ваш ответ конкретно о UINavigationController, название и концепция больше, поэтому я рассмотрю более крупные проблемы.)

  1. В родительском классе могут быть переменные, помеченные @private, и дочерние классы не могут получить к ним доступ, в отличие от значения по умолчанию @protected, которое доступно.
  2. Некоторые классы предназначены для создания подклассов (а большинство классов AppKit и UIKit -), но для других это крайне неразумно. Например, ключевые фундаментальные классы, такие как NSString, NSMutableArray и т. Д., На самом деле являются кластерами классов, то есть экземпляр класса может фактически быть одним из нескольких частных классов.
  3. Классы, которые предназначены для создания подклассов, обычно документируют ключевые методы, которые должны быть переопределены. Например, NSDictionary и NSMutableDictionary описывают несколько «примитивных» методов, которые вызывает каждый другой метод, поэтому переопределение 2 или 3 в каждом случае достаточно для изменения поведения без повторной реализации всего остального.
  4. Будьте предельно осторожны, чтобы вызывать реализацию родительского класса вашего переопределенного метода, если и когда это необходимо. Это может быть особенно важно в классах пользовательского интерфейса, которые часто имеют более сложное поведение, чем простые классы данных get / set.

В этом случае вы совершенно правы, что не пишете класс с нуля - это было бы Плохой Идеей ™. Если вы хотите изменить значение атрибута по умолчанию (поле?), Вы можете установить желаемое значение в инициализаторе после вызова инициализатора родителя. Однако, если вы сделаете это, убедитесь, что вы не теряете что-то в родительском классе, и всегда тщательно проверяйте.

Apple зарезервировала методы, которые начинаются с "_", для собственного использования, поэтому я бы повторил предостережение Марка о том, чтобы вообще не трогать их. Все остальное - честная игра, в пределах разумного конечно. : -)

2 голосов
/ 11 июня 2009

Нет, не стесняйтесь сходить с ума. Многие классы Какао не так удобны для подклассов, как другие (особенно те, которые должны больше полагаться на управление делегатами) и могут не предоставлять нужную вам функциональность, но вы можете свободно использовать любой класс, который не является закрытым (начинается с _ префикс). Вы могли бы даже сделать их подклассами, если бы вы действительно этого хотели, хотя на iPhone есть вероятность, что Apple отклонит ваше приложение.

...