你能在Objective-c中使用子类化多远?

时间:2009-06-10 21:12:29

标签: iphone objective-c oop subclass

在iPhone应用程序中,我需要自定义UINavigationController类的外观。例如,使条形和字体大小更大。我的客户真的需要它,还有更大的按钮。

因此,我决定继承UINavigationController,而不是从头开始编写类。我的问题是,我可以自定义任何方法或属性的默认值吗?在继承类时是否有任何限制?

2 个答案:

答案 0 :(得分:2)

不,随便疯了。许多Cocoa类不像其他类(尤其是那些意图更多地依赖于委托控制的那些)那样是子类化友好的,并且可能不会暴露您需要的功能,但是您可以随意子类化任何非私有的方法(以_开头)字首)。如果你真的想要,你甚至可以将它们分类,尽管在iPhone上,Apple很可能会拒绝你的应用程序。

答案 1 :(得分:2)

这取决于你所说的“限制”。运行时不会阻止你继承任何你喜欢的东西,但有一些陷阱。 (虽然你的答案是关于UINavigationController的,但标题和概念更大,所以我将解决更大的问题。)

  1. 父类中可能存在标记为@private并且子类无法访问的变量,而默认值为@protected可以访问。
  2. 有些类是为子类化而设计的(大多数AppKit和UIKit类都是),但对于其他类来说,它是非常不明智的。例如,像NSS​​tring,NSMutableArray等关键基础类实际上是类集群,这意味着类的实例实际上可能是几个私有类之一。
  3. 为子类设计 的类通常会记录必须重写的关键方法。例如,NSDictionary和NSMutableDictionary描述了一些其他方法调用的“原始”方法,因此在每种情况下覆盖2或3就足以改变行为而无需重新实现其他所有方法。
  4. 如果有必要,请非常小心地调用父类的重写方法实现。这在UI类中尤为重要,UI类通常比简单的get / set数据类具有更复杂的行为。
  5. 在这种情况下,你完全没有从头开始编写课程 - 这将是一个坏主意™。如果要更改属性的默认值(字段?),可以在调用父级初始值设定项后的初始值设定项中设置所需的值。但是,如果你这样做,请确保你没有在父类中输入某些东西,并且总是彻底测试。

    Apple保留了以“_”开头的方法供自己使用,所以我要回应Marc的注意,不要碰那些。当然,其他一切都是公平的游戏。 : - )