やりたいことは基本的に不可能です。これを忘れないでください:
@property(strong) AbstractPage *page;
getterと setter を宣言します。
一般的に言えば (Objective-C だけでなく、一般的なオブジェクト指向プログラミングの場合)、オーバーライド ゲッターがスーパー クラス実装の戻り値の型のサブクラスを返すことに問題はありません。これは API コントラクトを破らないためです。あなたの場合、のインスタンスWhitePage
もAbstractPage
です。
ただし、セッターは違います。AbstractBook
サブクラスは anが使用されている場所ならどこでも使用できる必要があるため、パラメーターの型を制限することはできAbstractBook
ません。 AbstractPage
APIは言います。
私がすることは、次のAbstractBook
ようなメソッドを呼び出すことだと思います
-(bool) isLegalPage: (AbstractPage) aPage;
基本クラスでは常に true を返しますが、 のホワイト ページに対してのみ true を返しますWhiteBook
。次に、次のようにセッターを手動で実装します。
-(void) setPage: (AbstractPage*) aPage
{
if (![self isLegalPage: aPage])
{
// throw an exception or do other error notification
}
else
{
Do the assignment according to reference count/ARC/GC model
}
}
ページが正当でない場合にセッターが例外をスローすること、およびisLegalPage:
メソッドを使用してこれをテストする必要があることを文書化します。
読み取り専用プロパティを持ち、基本クラスとサブクラスで異なるセッターを使用するか、基本クラスにセッターをまったく持たない代替 ID。