高度にカスタマイズされた、または複雑なビューを持つアプリケーションを考えてみましょう。
特定の種類のビュー コントローラーが特定の種類の UIView にメソッドを送信するようにします。UIView 自体は多数の他のビューで構成されています。
ビューには、ドメイン固有のリッチなインターフェイスが必要です。これにより、コントローラーが機能できるようになり、ビューと同様にリッチなモデルの間の薄い「接着剤」レイヤーになります。
したがって、コントローラーのビュー プロパティを次のようにオーバーライドします。
@interface PlaybackViewController : UIViewController<StageLayoutDelegate, ControlPanelDelegate>
{
NSMutableArray* _sections;
LightingMode _lightingMode;
}
@property (nonatomic, strong) PlaybackView* view; // <------ Specific type of view
#pragma mark - injected
@property (nonatomic, strong) id<OscClient> oscClient;
@property (nonatomic, strong) AbstractStageLayoutView* stageLayoutView;
@end
オーバーライドは、別のアクセサーを定義するよりも理にかなっています。また、キャストすることなく、特定のタイプの UIView にメッセージを送信するだけで済みます。
問題:唯一の問題は、コンパイラの警告が発生することです。
プロパティ タイプ 'PlaybackView *' は、'UIViewController' から継承されたタイプ 'UIView *' と互換性がありません
. . 警告のないコードを作成するのが好きです。このようにして、有効な警告が他の警告に埋もれて見逃されることはありません。
質問:
- この特定の警告を抑制する方法はありますか?
- 最近のほとんどのオブジェクト指向言語では、スーパークラスで宣言された型のより具体的なサブクラスを返すように、サブクラスのプロパティまたはメソッドを喜んでオーバーライドできるのに、なぜこれがデフォルト設定の一部なのですか?