不在超类的头文件中的继承方法

时间:2011-09-01 10:25:55

标签: objective-c inheritance header-files

有没有办法在超类中使用“私有”方法(不在其头文件中)并且仍然能够从子类访问这些方法?

2 个答案:

答案 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没有protectedprivate方法的真实概念。基本上,任何人都可以包含Stuffy+Secret.h并使用那里声明的内容。

答案 1 :(得分:1)

你可以通过几种方式“欺骗”。除了类别之外,您只需将Stuffy指针投射到FunnyStuff,并为其设置一个整体'@interface。 (只是不要声明任何静态而不要执行@implementation。)或者,更清洁一点,投射到定义添加方法的@protocol。 (而且,既然你正在做一个子类,你可以简单地将协议添加到子类定义中,并避免任何转换。)

请记住,Objective-C不要求@implementation中的每个方法都在@interface中有相应的声明,方法调用完全是动态的,有效地包括名称查找。您唯一要做的就是欺骗编译器允许调用。 (事实上​​,如果你不介意编译器警告,你可以完全没有声明地进行调用。)