「制限」の意味によって異なります。ランタイムはあなたが好きなものをサブクラス化するのを妨げませんが、いくつかの問題があります。 (あなたの答えはUINavigationControllerについて、具体的ではあるが、タイトルとコンセプトが大きくされているので、私は大きな問題に対処します。)
@private
と子のクラスをマークされている親クラスの変数にアクセスすることはできませんがあるかもしれません、アクセス可能な既定値の@protected
を指定します。
- 一部のクラスはサブクラス化のために設計されていますが(ほとんどのAppKitクラスとUIKitクラスがあります)、他のクラスは非常に賢明ではありません。たとえば、NSString、NSMutableArrayなどの基本的な基底クラスは実際にはクラスクラスタです。つまり、クラスのインスタンスは実際にはいくつかのプライベートクラスの1つになる場合があります。
- がサブクラス化のために設計されたであるクラスは、通常、オーバーライドする必要のあるキーメソッドを文書化します。例えば、NSDictionaryとNSMutableDictionaryは、他のすべてのメソッドが呼び出すいくつかの「プリミティブ」メソッドを記述しています。したがって、2または3をそれぞれオーバーライドすれば、他のすべてのメソッドを再実装せずに動作を変更できます。
- 親クラスのオーバーライドされたメソッドの実装を、必要に応じて、非常に注意してください。これは、UIクラスでは特に重要です。単純なget/setデータクラスよりも複雑な動作をすることがよくあります。
この場合、クラスを最初から作成しないでください。これはBad Idea™になります。属性のデフォルト値(フィールド?)を変更する場合は、の後に、イニシャライザに希望の値を設定して、親の初期化子を呼び出すことができます。しかし、これを行う場合は、親クラスで何かをしゃべらないようにして、常に徹底的にテストしてください。
アップルでは独自の方法で「_」で始まるメソッドを予約しています。そのため、マークには触れないように注意してください。他のすべては、当然ながら、公正なゲームです。 :-)