1

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

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

4

2 回答 2

2

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

于 2009-06-10T22:03:01.773 回答
2

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

  1. 父类中可能有变量被标记@private,子类无法访问,而默认的@protected是可访问的。
  2. 有些类是为子类而设计的(大多数 AppKit 和 UIKit 类都是),但对于其他类来说,这是非常不明智的。例如,NSString、NSMutableArray 等关键基础类实际上是类集群,这意味着该类的实例实际上可能是几个私有类之一。
  3. 为子类化设计的类通常会记录必须重写的关键方法。例如,NSDictionary 和 NSMutableDictionary 描述了一些其他方法都调用的“原始”方法,因此在每种情况下覆盖 2 或 3 就足以改变行为而无需重新实现其他所有方法。
  4. 如果有必要,请非常小心地调用父类的重写方法的实现。这在 UI 类中尤其重要,它通常比简单的 get/set 数据类具有更复杂的行为。

在这种情况下,您不从头开始编写课程是完全正确的——那将是一个坏主意™。如果要更改属性(字段?)的默认值,可以在调用父级的初始化程序后在初始化程序中设置所需的值。但是,如果您这样做,请确保您没有在父类中使用任何东西,并始终进行彻底的测试。

Apple 保留了以“_”开头的方法供自己使用,所以我同意 Marc 的警告,即根本不要碰这些方法。其他一切都是公平的游戏,当然是合理的。:-)

于 2009-06-11T16:48:58.943 回答