スーパークラスで読み書き可能なプロパティをサブクラスで読み取り専用にできますか?
以下のように、スーパークラスで readwrite 属性のプロパティをサブクラスで readonly にしたいのですが、
@interface SuperClass : NSObject
@property (strong, nonatomic, readwrite) NSObject *variable;
@end
@interface SubClass : SuperClass
@property (strong, nonatomic, readonly) NSObject *variable; // 注意が出る
@end
サブクラスのほうで注意が表示され、
Attribute 'readonly' of property 'variable' restricts attribute 'readwrite' of property inherited from 'SuperClass'.
サブクラスの実装でアクセスしてみると、やはり書き込みできてしまいます。
@implementation SubClass
- (void)method {
self.variable = [[NSObject alloc] init]; // 書き込みできてしまう
}
@end
妥協案
そのため、現在妥協案として以下のようにサブクラスではプロパティのセッタを無効にし、ドット記法でアクセスされた時のためにセッタの実装も空にしています。
@interface SubClass : SuperClass
- (void)setVariable:(NSObject *)variable __unavailable;
@end
@implementation SubClass
- (void)setVariable:(NSObject *)variable {
return;
}
@end
この動作を Objective-C の言語的に、スマートに実現できないでしょうか? この方法だと readonly にしたいプロパティへのドット記法での書き込みに対して何の警告も出せないのが不親切で困っています。
環境
Xcode 5.1.1 / iOS 7.1 SDK