我可以从班级用户那里隐藏我的超类吗?

时间:2014-05-06 06:29:24

标签: objective-c inheritance

是否可以封装我的类派生自某个超类的事实?类似的东西:

@class NoneOfYourBusiness;
@interface MyClass : NoneOfYourBusiness
@end

编译器不喜欢这样:尝试使用前向类'NoneOfYourBusiness'作为'MyClass'的超类

2 个答案:

答案 0 :(得分:0)

你可以添加一些间接;继承树中的虚拟超类,位于MyClassRealSuperclass之间:

私有标头,HiddenSuperclass.h,带有相应的实现文件

#import <Foundation/Foundation.h>

@interface HiddenSuper : NSObject

- (void)makePancakes;

@end

虚拟类的标题,对应的空实现

#import <Foundation/Foundation.h>
#import "HiddenSuper.h"

@interface DummySuper : HiddenSuper
// Nothing to see here, folks!
@end

然后你的公共课的标题:

#import "DummySuper.h"

@interface PublicSubclass : DummySuper

- (void)fixBreakfast;

@end

实现,由编译隐藏:

#import "PublicSubclass.h"
#import "HiddenSuper.h"

@implementation PublicSubclass

- (void)fixBreakfast
{
    [self makePancakes];
}

@end

答案 1 :(得分:0)

两个答案


这个要求毫无意义。客户端代码可以看到超类没有任何意义,因为它应该是空的。

即。这就是他们所能看到的一切

@interface NoneOfYourBusiness : NSObject
@end
@interface MyClass : NoneOfYourBusiness
- (void)publicMethod;
@end

因为您应该将所有私有/内部方法/变量放在私有头/实现文件中。


好的,你真的需要隐藏它出于某种原因,然后隐藏一切

公共标题

@interface MyClass : NSObject
- (void)publicMethod;
@end

私有标头/实施文件

@interface NoneOfYourBusiness : NSObject
@end

@interface MyClassImpl : NoneOfYourBusiness
- (void)publicMethod;
@end

@interface MyClass ()
@property (strong) MyClassImpl *impl;
@end
@implementation
- (id)forwardingTargetForSelector:(SEL)aSelector
{
    return self.impl;
}
@end

您甚至可以从MyClass继承NSProxy以使其成为真正的代理对象