1

私は、init メソッドを公開せず、クラスレベルのメッセージから特殊な I-don't-know-what を実行するサード パーティのライブラリを使用しています。それは私がサブクラス化することを禁止しますか?

テスト ケースを作成しました (ARC が有効)

ああ

@interface A : NSObject 
@property (nonatomic, strong) NSString * bar;
-(id) initWithAbar:(NSString *) bar;
+(id) aWithBar:(NSString *) bar;
@end

午前

#import "A.h"
@implementation A
-(id) initWithAbar:(NSString *) bar
{
    self = [super init];
    if (self) {
        self.bar = bar;
    }
    return self;
}


+(id) aWithBar:(NSString *) bar
{
    return [[A alloc] initWithAbar:bar];
}

@end

Bh

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

@interface B : A
@property (nonatomic, strong) NSString *foo;
-(id) initWithFoo:(NSString *)foo bar:(NSString *)bar;
@end

Bm

#import "B.h"

@implementation B

-(id) initWithFoo:(NSString *)foo bar:(NSString *)bar
{
    self = (B*)[A aWithBar:bar]; // Still actually A, knew that by printing [self class];
    if (self) {
        self.foo = foo; // Error: unrecognized selector here
    }
    return self;
}

@end

A を単に呼び出すことができないと仮定するとinitWithAbar:、 A をサブクラス化する際に選択肢はありますか? A の aWithBar が A の init を呼び出している場合、init の何がそんなに特別なのでしょうか?

4

1 に答える 1