Objective-C子类化:是否必须在头文件中声明超类方法才能在子类中使用?

时间:2015-01-26 03:04:55

标签: objective-c

让我们说这个例子:

Class.h:

@interface Class : NSObject

/* No public methods or ivars */

Class.m:

@implementation Class

-(void)methodOne{}
-(void)methodTwo{};

Subclass.h:

@interface Subclass : NSObject

/* No public methods or ivars */

Subclass.m:

@implementation Subclass

/* I want to override methodOne and methodTwo from superclass but can't. They don't show up as methods */

您是否必须在其头文件中将超类中的方法显式声明为public才能使用子类中的方法?我认为实现文件中的方法只能被覆盖。

2 个答案:

答案 0 :(得分:1)

重写私有方法是不好的做法。私有化的全部意义在于,没有人应该依赖它们。私人方法就是私有方法。他们的签名可能会改变,他们的实施可能会改变,或者他们将来可能会消失。如果子类重写私有方法,任何此类更改都将导致子类中断。如果要覆盖该方法,则应将其公开,并且API应该是稳定的。

如果方法只应由子类重写并且从不被基类的其他客户端调用,则基类应提供第二个头文件,声明类别中的方法,专门用于仅由子类导入和使用。

这方面的一个很好的例子是Apple提供的课程UIGestureRecognizer。有一个特殊的头文件" UIGestureRecognizerSubclass.h"只由子类导入。请参阅"子类说明" UIGestureRecognizer的文档部分了解更多详情。

答案 1 :(得分:0)

  

您是否必须在其头文件中将超类中的方法显式声明为public才能使用子类中的方法?

不,这些方法不必在超类头文件中声明。它们可以声明为class extension的一部分。

使用您的示例,这看起来像:

@interface Class(SomeNameOrNot)

-(void)methodOne{}
-(void)methodTwo{};

@end

这可以用两种方式表示:头文件或实现文件的一部分。

因此,例如,如果Subclass并且只有该类需要知道这些选择器,则上述类扩展将进入Subclass.m

如果这些方法旨在由Class的任何子类使用,但不打算公开,那么它们可能会进入只有那些子类知道的头文件(即Class_Internal.h )。这是提供Java protected访问权限的常用方法 - 一组接口仅适用于通过导入私有标头选择使用它的子类。