これを行うことが許可されているというあなたの疑いには十分な根拠がありますが、この特定のケースでは大丈夫です...
オーバーライドの厳密なサブタイプ解釈では、オーバーライド メソッドは、より一般的な型の引数を受け入れ、より具体的な型の値を返す場合があります。
たとえば、Objective-C を使用すると、次のようになります。
@interface A : NSObject { ... }
@interface B : A { ... }
@interface C : B { ... }
BのメソッドM:
- (B *) M:(B *)arg { ... }
次に、厳密なサブタイプの下のクラス C では、次を使用してクラス C でこれをオーバーライドできます。
- (C *) M:(A *)arg { ... }
明らかに B オブジェクトへの参照がある場合、これは安全です。
B *bObj = ...;
次に、メソッド M が次のように呼び出されます。
B *anotherBObj = [bObj M:[B new]];
次に、bObj
実際に B か C かは、呼び出しの型が正しいことです。C オブジェクトの場合、B である引数は A でもあるので問題なく、C である結果も B であるため問題ありません。
これにより、完全ではありませんが、あなたの財産につながります。Objective-C では、プロパティは 2 つのメソッドの省略形にすぎません。
@property B *myBvalue;
は次の省略形です。
- (void) setMyBvalue:(B *)value;
- (B *) myBvalue;
そのプロパティが B で宣言され、C 値のプロパティを使用してクラス C でオーバーライドする場合:
@property C *myBvalue;
あなたが得る:
- (void) setMyBvalue:(C *)value;
- (C *) myBvalue;
メソッドsetMyBvalue:
は厳密なサブタイピング ルールに違反しています。C インスタンスを B インスタンスにキャストすると、型付けルールでは B を渡すことができ、メソッドは C を期待し、混乱が生じる可能性があります。
ただし、あなたの場合、オーバーライドしているプロパティはreadonly
であるため、セッターも危険もありません。