【发布时间】:2019-01-18 02:30:01
【问题描述】:
问题
在 Objective-C 中使用私有类时如何隐藏它?
例如,如下所述
PrivateFilter 是我要隐藏的类。
CustomFilter 是我开设的课程,它是开放的。
GPUImageFilter 是 Github 上的公开课程,也是开放的。
而CustomFilter实际上封装了PrivateFilter的功能。
@interface CustomFilter : GPUImageFilter
@end
@interface PrivateFilter : GPUImageFilter
@end
可能的解决方案
所以有两种解决方案:
解决方案一:类集群
查看Apple document 中的示例A Composite Object: An Example。
我按照步骤制作了以下代码。
// CustomFilter.h
@interface CustomFilter : GPUImageFilter
@end
// CustomFilter.m
@interface CustomFilter()
@property (nonatomic, strong) PrivateFilter *privateFilter;
@end
@implementation CustomFilter
- (instancetype)init
{
self = [super init];
if (self) {
_privateFilter = [[PrivateFilter alloc] init];
}
return self;
}
// and then override the most of GPUImageFilter functions...
@end
但不知何故它不起作用,所以我尝试了解决方案 2。
解决方案 2:使用 PrivateFilter 初始化
// CustomFilter.h
@interface CustomFilter : GPUImageFilter
@end
// CustomFilter.m
@implementation CustomFilter
- (CustomFilter *)init
{
self = (CustomFilter *)[[PrivateFilter alloc] init];
return self;
}
@end
这可行,但是在init 中使用alloc 很奇怪。
所以我尝试了解决方案 3。
方案三:工厂类方法
// CustomFilter.h
@interface CustomFilter : GPUImageFilter
+ (CustomFilter *)filter;
@end
// CustomFilter.m
@implementation CustomFilter
+ (CustomFilter *)filter
{
CustomFilter *filter = (CustomFilter *)[[PrivateFilter alloc] init];
return filter;
}
@end
这可行,但它不能被继承,就像类集群一样。
重复问题
那么哪个是最好的解决方案?还是有其他好的解决方案?
【问题讨论】:
-
我认为第一个应该可以工作,对于继承然后你可以将所有实现转发到私有属性,虽然需要重写每个函数
标签: ios objective-c inheritance class-cluster private-class