-6

NSMutableStringから継承しNSStringますが

  1. 継承は「isa」関係として機能します。つまり、猫は「動物」です。しかし、NSMutableString「ではない」NSString。(NSString変更できない(変更できない)ため)

  2. 通常、サブクラスが実行することは、基本クラスが実行できる必要があります。魚などは泳げますし、動物も泳げます。しかし、NSMutableString変更することはできますが、NSStringまったく変更することはできませNSStringん。変更できるものはありません。

では、なぜNSMutableString継承するのNSStringですか?また、NSMutableArrayから継承しNSArrayます。NSStringから継承するべきではありませNSMutableArray insteadんが、代わりに「フラグを変更しない」をYESに設定しますか?この背後にある原則は何ですか?

更新:いくつかの答えは言うでしょう:NSMutableStringできることはすべてNSStringできるので、NSMutableStringから継承しNSStringます。しかし、この原則を使用することはできますか?石はじっとしていることができます。猫はじっとしていることができ、動くことができます。猫は石ができることはすべてできますが、猫を石から継承させることはできませんよね?

2つのゲームオブジェクトクラスがある場合、1つは弾性オブジェクトで、もう1つは非弾性オブジェクトです。弾性オブジェクトを基本クラスとして実装することは理にかなっていると思います。非弾性は、外側の境界を示すフラグを使用して継承します。変えられない。

4

5 に答える 5

4

継承は「is a」関係として機能します。つまり、猫は「動物」です。しかし、NSMutableString は NSString ではありません

違う。NSMutableString、NSString でできることは何でもできるので、NSString です。

通常、サブクラスができることは、基本クラスができるはずです

また間違っています。それは逆です。それはむしろ「基本クラスでできることは、サブクラスでも実行できる必要があります」です。

代わりに、NSString は NSMutableArray から継承すべきではありませんか?

wchar_t2つの関係さえわかりません(有効なObjective-Cオブジェクトでない限り)。

全体として、その理由は、NSMutableString が NSString よりも多くのことを行うことができ、NSString ができることは何でもできるため、継承の方向です。

于 2012-09-21T11:19:57.167 に答える
1

サブクラス<->クラスの関係は、「is-a」関係と呼ばれることがよくあります。しかし実際には、Javaはそれをよりよく説明していると思いますextends。サブクラスはその基本クラスの機能を拡張します。

NSStringオブジェクトは、エンコーディングとともに文字列を保存するためのすべてを知っています。
NSMutableStringオブジェクトはこれをすべて知っていますが、保存されている文字列を変更する方法も知っているので、「NSMutableStringextendsNSString」と言うのは理にかなっています。

1つのコメントから:

基本クラスは、より広範で一般的なものにする必要があります。可変ストリングがより広く一般的であるように、動物はより広く一般的です。不変の文字列はより「特定」です。そのため、このように見ると、ベースケースは変更可能なケースである必要があります。

NSStringは、NSMutableStringの実装を使用せずに、変更機能を追加できる別のサブクラスを作成する機会を残すため、より一般的です。機能がNSString自体に配置される場合は、もう一度追加するだけで、オブジェクトにコードが含まれ、それが複製され、コードの膨張につながります。ボタンのラベルなど、文字列が変更されない状況も数多くあります。ミューテーションのすべてのコードとともにミュータブルオブジェクトとしてインスタンス化されるとしたら、頼りになるのは無駄です。

2つのゲームオブジェクトクラスがある場合、1つは弾性オブジェクトで、もう1つは非弾性オブジェクトです。弾性オブジェクトを基本クラスとして実装することは理にかなっていると思います。非弾性は、外側の境界を示すフラグを使用して継承します。変えられない。

いいえ、それは弱い設計になります。非弾性オブジェクトは、弾性動作を実行するために使用されるすべてのコードを運ぶためです。

于 2012-09-21T11:54:48.983 に答える
1

可変バージョンは、不変バージョンに追加の機能を追加します。これが、他のバージョンから継承する理由です。

しかし、あなたが見逃しているもう1つの理由は、可変/不変のバージョンを持つクラスが、実際には多くの実装を隠しているクラスクラスターのメンバーであることです。したがって、単純なクラス継承として考えていることは、それ以上のものです。

継承により、リスコフの置換原理を適用する便利な方法も可能になります。

于 2012-09-21T11:11:57.403 に答える
0

継承が「is a」関係として機能すると言うのは正しいですが、完全に誤解を招きます。英語の「is a」は、「to be」の完全な意味を意味します。継承の場合、「is a」はサブタイプの関係のみを意味します (そして、より強力な Liskov 置換原則の要件が満たされるようにクラスをコーディングすることをお勧めします)。

より適切な英語の用語 (まだ完全ではありませんが、より適切です) は、「X は Y が行うすべてのことを行う」です。さらに良いことに、典型的な OO 用語では、「X には Y が持つすべてのメンバーがある」という意味です。

ANSMutable*は確かに an のサブタイプであり、NS*その逆ではありません。(本質的に変化しない) メッセージと an のプロパティNS*も適用されNSMutable*ますが、後者の変化するメッセージまたは可変プロパティは前者には適用されません。

通常、サブクラスができることは、基本クラスができるはずです。間違っています。実際は逆です。基本クラスでできることは、派生クラスでもできるはずです。

文字列と配列に関しては、Objective-C では、配列と文字列には非常に異なるメソッド セットがあります。クラスのドキュメントを確認してください。したがって、これらは継承階層で完全に分離されています (もちろん、 common を除きますNSObject)。

石と猫のあなたの例に関して、石の唯一の特徴は静止していることであり、猫の唯一の特徴は静止しているか、動くことができることです.これらの特性の適切な定義のために、猫は石から継承します。

于 2012-09-21T11:21:41.960 に答える
0

継承とは、元のクラス、特に機能の拡大と多様性を意味すると思います。哺乳類は通常、陸生動物ですが、イルカは海に生息する場合もあります。イルカは哺乳類から受け継いで海での生活の中でその機能を拡張したと言えます。

于 2012-09-21T11:18:04.477 に答える