有没有办法在超类中使用“私有”方法(不在其头文件中)并且仍然能够从子类访问这些方法?
答案 0 :(得分:3)
您可以使用自定义类别,例如:
Stuffy.h
// The "official" header file to be used by almost anyone
@interface Stuffy {
int myMember;
}
- (void) somePublicMethod;
@end
闷+ Secret.h
// The magic header file, which should only be used by knowledgable people
#import "Stuffy.h"
@interface Stuffy (Secret)
- (void) _pseudoProtectedMethod;
@end
Stuffy.m
#import "Stuffy+Secret.h"
@implementation Stuffy
- (void) somePublicMethod {
// ...
}
@end
@implementation Stuffy (Secret)
- (void) _pseudoProtectedMethod {
// ...
}
@end
Stuffy
的子类现在可以在Stuffy.h
文件中导入.m
并坚持使用公共API,或导入Stuffy+Secret.h
并使用半保护的内容。< / p>
请注意,Objective-C没有protected
或private
方法的真实概念。基本上,任何人都可以包含Stuffy+Secret.h
并使用那里声明的内容。
答案 1 :(得分:1)
你可以通过几种方式“欺骗”。除了类别之外,您只需将Stuffy
指针投射到FunnyStuff
,并为其设置一个整体'@interface
。 (只是不要声明任何静态而不要执行@implementation
。)或者,更清洁一点,投射到定义添加方法的@protocol
。 (而且,既然你正在做一个子类,你可以简单地将协议添加到子类定义中,并避免任何转换。)
请记住,Objective-C不要求@implementation
中的每个方法都在@interface
中有相应的声明,方法调用完全是动态的,有效地包括名称查找。您唯一要做的就是欺骗编译器允许调用。 (事实上,如果你不介意编译器警告,你可以完全没有声明地进行调用。)