【问题标题】:How do we hide private class when using it in Objective-C?在 Objective-C 中使用私有类时如何隐藏它?
【发布时间】: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


【解决方案1】:

我认为您需要协议,而不是使用工厂方法的 CustomFilter。如果你需要一些GPUImageFilter 子类,你可以创建GPUImageFilter<CustomFilter>

//CustomFilter.h
@protocol CustomFilter

...

@end

typedef GPUImageFilter<CustomFilter> CustomFilter;

//PrivateFilter.h
#import "CustomFilter.h"
@interface PrivateFitler: CustomFilter
...
@end

//GPUImageFilter+CustomFilter.h
@interface GPUImageFilter(CustomFilter)

+ (CustomFilter *)filter;

@end

//GPUImageFilter+CustomFilter.m
#import "PrivateFilter.h"

@implementation GPUImageFilter(CustomFilter)

+ (CustomFilter *)filter
{
    return [[PrivateFilter alloc] init;
}
@end

使用这种方法,如果您忘记实现某些方法,Xcode 甚至会给您警告。

【讨论】:

  • 暂时不能让PrivateFitler继承CustomFilter,因为PrivateFitler是第三方库。对于GPUImageFilter&lt;CustomFilter&gt;,我认为GPUImageFilter&lt;CustomFilterProtol&gt; 可能是一个更好的命名方式?不过,这是从 Xcode 获取警告的好方法,谢谢!
  • @allenlinli 你应该从PrivateFitler 是来自第三方库的类开始。您应该只创建协议并从您的结构中返回它。
猜你喜欢
  • 2019-11-14
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 2011-12-02
  • 2023-03-28
  • 2016-07-27
相关资源
最近更新 更多