让我们说这个例子:
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才能使用子类中的方法?我认为实现文件中的方法只能被覆盖。
答案 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
访问权限的常用方法 - 一组接口仅适用于通过导入私有标头选择使用它的子类。