私は、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 の何がそんなに特別なのでしょうか?