確かに、順序付き集合はより具体的な集合の集合であるため、なぜではなく、NSOrderedSet
がNSObject
から継承しますか?NSOrderedSetがNSSetから継承しないのはなぜですか?
答えて
私はNSSet
のインターフェイスを経由しました。あなたは正しいです、注文セットはLiskov substitution principleを満足するように見え、そのためNSSet
から継承することができます。
これを破る少しの方法があります:mutableCopy
。 mutableCopy
の戻り値はNSMutableSet
である必要がありますが、NSMutableOrderedSet
はNSOrderedSet
から継承する必要があります。両方を持つことはできません。
いくつかのコードで説明しましょう。まずは、NSSet
とNSMutableSet
の正しい動作を見てみましょう:
NSSet* immutable = [NSSet set];
NSMutableSet* mutable = [immutable mutableCopy];
[mutable isKindOfClass:[NSSet class]]; // YES
[mutable isKindOfClass:[NSMutableSet class]]; // YES
、のはNSSet
からNSOrderedSet
継承をふりましょう、とNSOrderedSet
からNSMutableOrderedSet
継承:
//Example 1
NSOrderedSet* immutable = [NSOrderedSet orderedSet];
NSMutableOrderedSet* mutable = [immutable mutableCopy];
[mutable isKindOfClass:[NSSet class]]; // YES
[mutable isKindOfClass:[NSMutableSet class]]; // NO (this is the problem)
NSMutableOrderedSet
ではなくNSMutableSet
から継承された場合はどう?
//Example 2
NSOrderedSet* immutable = [NSOrderedSet orderedSet];
NSMutableOrderedSet* mutable = [immutable mutableCopy];
[mutable isKindOfClass:[NSSet class]]; // YES
[mutable isKindOfClass:[NSMutableSet class]]; // YES
[mutable isKindOfClass:[NSOrderedSet class]]; // NO (this is a problem)
は、実施例1では、あなたは振る舞いが異なるためNSSet
を期待関数にNSOrderedSet
を渡すことができないだろう。その後、我々は別の問題を取得します。基本的には、下位互換性の問題です。
例2では、NSMutableOrderedSet
は、NSOrderedSet
を期待する関数に渡すことができません。後者から継承しないためです。
NSMutableOrderedSet
は、Objective-Cに多重継承がないため、NSMutableSet
とNSOrderedSet
の両方を継承できないためです。これを回避する方法は、が両方のプロトコルを実装できるので、NSMutableSet
とNSOrderedSet
のプロトコルを作ることです。 Appleの開発者は、余分なプロトコルがなくても簡単だったと思う。
私はプロトコルがもっと理にかなっていると思います。NSMutableSetがすでに定義されていて、すでに変更可能性のためのプロトコルを使用していないという事実ともっと関係があります。'NSMutableSet'が既にそれに従っているにもかかわらず、プロトコルはまだ追加できませんでしたか? – jhabbott
彼らが望むなら、何も壊すことなく新しいプロトコルを追加することができます。将来的に追加されるかもしれません。 –
偉大な答え、これはNSHipsterの本で使用されました。これは私がこの質問を見つけた方法です... NSHipsterの本がこの問題をクラスクラスタであるNSSetに直接リンクする理由を知っていますか?これは変更可能なコピーの問題とは異なる具体的なクラスですが、あなたは知っていますか? http://nshipster.com/nsorderedset/ –
- 1. ControllerはGitHubではControllerBaseを継承しますが、VSでは継承しないのはなぜですか?
- 2. ApplicationContextがAbstractApplicationContextから継承されないのはなぜですか?
- 3. なぜSpringロガーがorg.springframeworkから継承されないのですか
- 4. Rubyモジュールの継承がクラス継承のように機能しないのはなぜですか?
- 5. NSSetにwriteToFileメソッドがないのはなぜですか?
- 6. 継承がうまくいかないと思うのはなぜですか?
- 7. boost :: scoped_ptrが継承シナリオで動作しないのはなぜですか?
- 8. コンストラクタがスーパーコンストラクタのメソッドを継承しないのはなぜですか?
- 9. クラス(data.frame(...))がリストの継承を表示しないのはなぜですか?
- 10. なぜオブジェクト型から継承するのですか
- 11. この例では、子クラスが親クラスからメソッドを継承しないのはなぜですか?
- 12. AppDelegateクラスがUIResponderから継承するのはなぜですか?
- 13. admin generatorがNewsForm.class.phpから継承するのはなぜですか?
- 14. 値型が参照型から継承するのはなぜですか?
- 15. CSSが継承しない継承
- 16. なぜJavascriptはデフォルトで継承をサポートしていないのですか?
- 17. AoPで純粋な継承ベースのプロキシが悪いのはなぜですか?
- 18. なぜCSSはそれ自身で継承しないのですか
- 19. Javaクラスが実装されたインタフェースからアノテーションを継承しないのはなぜですか?
- 20. QLabelから継承したクラス。カスタムスロットが呼び出されないのはなぜですか?
- 21. なぜconsole.log()はObject.createの継承プロパティを表示しないのですか?
- 22. コンストラクタがプライベートであるクラスから継承できないのはなぜですか?
- 23. 私のディレクティブが親スコープから関数を継承できないのはなぜですか?
- 24. クラスが宣言型の結果から継承できないのはなぜですか?
- 25. なぜ、私は基本クラスを継承しているのですか? 'AttributeError'はなぜですか?
- 26. ES5でArrayから継承するのが難しいのはなぜですか?
- 27. JavaScript ES5のプロトタイプ継承でサロゲートクラスが必要なのはなぜですか?
- 28. Python、なぜ私たちは 'list'クラスを継承しなければならないのですか?
- 29. なぜこのKotlin Objectはそれ自身から継承できますか?
- 30. ここからボディーにボーダーが継承されないのはなぜですか?
developer.apple.comが今ではダウンしていない場合は、今私は好奇心を持っているので、私はドキュメントを見に行くだろう!優れた質問。そして、うまくいけば、アップルのサイトはあまりにも長く続くのではないでしょうか? – WendiKidd
(免責:これは純粋な推測であり、答えとして実際に提供したいとは私にはあまりにも説得力がありませんが...)NSOrderedSetは、NSSetとNSArrayの両方のより具体的なケースです。これらはどちらもプロトコルではなく、Objective-Cに多重継承はありません。だから、あなたはどちらを選ぶのですか?名前のためにNSSetの引数がありますが、それは完全にNSUniqueArrayだったでしょうか?それを安全にして、両者を捨てなさい... –
私はあなたが言っていることを正確に見ていますが、あなたはそれが納得のいくものではないことは間違いありません。私は直感的に '' [aSet intersectsSet:anOrderedSet] 'が可能であることを期待しています(しかし' NSOrderedSet'は 'NSSet'のサブクラスではないので)' NSSet'はスーパークラスに対して ' NSArray' - そしてそれらが等しく論理的な選択肢を作ったとしても、多形性を失うことは、どちらにせよ劣位の選択肢を選択しない。 – jhabbott