「addChild」メソッドを持つ「Node」というクラスがあるとします。
@interface Node : NSObject
-(void) addChild:(Node *)n;
このメソッドに応答しない「Sprite」というサブクラスがあります。
@interface Sprite : Node
私はこのようなことができることを知っています:
@implementation Sprite
-(void) addChild:(Node *)n {
NSLog(@"Don't call addChild on a Sprite!");
}
また
-(void) addChild:(Node *)n {
NSAssert(NO, @"Don't call addChild on a Sprite!");
}
しかし、サブクラスがこのメソッドに応答しないことを宣言し、コンパイラにエラーをスローさせる方法はありますか? この場合、ランタイム エラーよりもコンパイラ エラーの方がはるかに優れています。
編集
これはリスコフの置換原理に違反していることに気づきました。しかし、Apple のドキュメントには次のように書かれています。
「すべての doesNotRecognizeSelector: メッセージは、通常、ランタイム システムによってのみ送信されます。ただし、プログラム コードで使用して、メソッドが継承されるのを防ぐことができます。たとえば、NSObject サブクラスは、copy または init メソッドを再実装することによって放棄する場合があります。 doesNotRecognizeSelector: メッセージを含めます..."
コンパイル時エラーではなく実行時エラーをスローすることで、この原則に違反することが少なくなる理由がわかりません。