0

質問

Objective-Cで使用するときにプライベートクラスを非表示にするにはどうすればよいですか?

たとえば、以下に示すよう PrivateFilterに、非表示にしたいクラスです。 CustomFilter私が作った、オープンなクラスです。 GPUImageFilterも公開されている Github で公開されているクラスです。CustomFilterの機能を実際にラップしますPrivateFilter

@interface CustomFilter : GPUImageFilter
@end

@interface PrivateFilter : GPUImageFilter
@end

可能な解決策

したがって、2 つの解決策があります。

解決策 1: クラス クラスタ

Apple ドキュメントの例を見て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

これは機能しますが、で使用するのは非常に奇妙allocですinit。だから私は解決策3を試します。

解決策 3: ファクトリ クラス メソッド

// CustomFilter.h
@interface CustomFilter : GPUImageFilter
+ (CustomFilter *)filter;
@end

// CustomFilter.m
@implementation CustomFilter
+ (CustomFilter *)filter
{
    CustomFilter *filter = (CustomFilter *)[[PrivateFilter alloc] init];
    return filter;
}

@end

これは機能しますが、クラス クラスターと同様に継承できませんでした。

質問を繰り返す

最善の解決策はどれですか?または、他に良い解決策はありますか?

4

1 に答える 1