在 iPhone 应用程序中,我需要自定义 UINavigationController 类的外观。例如,使栏和字体大小更大。我的客户真的需要这个,还有更大的按钮。
因此,我决定继承 UINavigationController,而不是从头开始编写类。我的问题是,我可以自定义任何方法或属性的默认值吗?子类化一个类时有什么限制吗?
在 iPhone 应用程序中,我需要自定义 UINavigationController 类的外观。例如,使栏和字体大小更大。我的客户真的需要这个,还有更大的按钮。
因此,我决定继承 UINavigationController,而不是从头开始编写类。我的问题是,我可以自定义任何方法或属性的默认值吗?子类化一个类时有什么限制吗?
不,随意发疯。许多 Cocoa 类不像其他类那样对子类化友好(尤其是那些更依赖委托控制的类)并且可能不会公开您需要的功能,但是您可以随意对任何非私有方法进行子类化(以 _ 开头字首)。如果你真的想的话,你甚至可以对它们进行子类化,尽管在 iPhone 上 Apple 可能会拒绝你的应用程序。
这取决于您所说的“限制”是什么意思。运行时不会阻止你继承任何你喜欢的东西,但是有一些陷阱。(虽然你的答案是专门针对 UINavigationController,但标题和概念更大,所以我会解决更大的问题。)
@private
,子类无法访问,而默认的@protected
是可访问的。在这种情况下,您不从头开始编写课程是完全正确的——那将是一个坏主意™。如果要更改属性(字段?)的默认值,可以在调用父级的初始化程序后在初始化程序中设置所需的值。但是,如果您这样做,请确保您没有在父类中使用任何东西,并始终进行彻底的测试。
Apple 保留了以“_”开头的方法供自己使用,所以我同意 Marc 的警告,即根本不要碰这些方法。其他一切都是公平的游戏,当然是合理的。:-)