0

SquareがRectangleのサブクラスである以下の行を考えると、次のようになります。

Rectangle *thisObject = [[Square alloc] init];

thisObjectには次のものが含まれます。1。Squareオブジェクトのすべてのインスタンス変数。2.Squareオブジェクトに実装されているすべてのインスタンスメソッド。3.Rectangleオブジェクトのすべてのインスタンス変数。4.Rectangleオブジェクトに実装されているすべてのインスタンスメソッド。

SquareがRectangleのサブクラスである以下の行を考えると、次のようになります。

Square *thisObject = [[Square alloc] init];

thisObjectには次のものが含まれます。1。Squareオブジェクトのすべてのインスタンス変数。2.Squareオブジェクトに実装されているすべてのインスタンスメソッド。3.Rectangleオブジェクトに実装されているすべてのインスタンスメソッド。

意見の相違はありますか?

4

3 に答える 3

4

いいえ、これらは同じです。2つの違いは、Rectangleとして入力されたthisObjectにSquareメッセージを送信しようとすると、コンパイラから警告が表示されることだけです。ただし、これは警告にすぎず、送信されるメッセージは実際には実行時に機能します。

于 2011-04-30T14:07:55.623 に答える
3

同意しません。2番目にはRectangleオブジェクトのすべてのインスタンス変数も含まれていることを見逃しました。

両方のインスタンスはまったく同じです。インスタンスは、クラスクラスターのようなものを除いて、後でそれらを主張するものではなく、それらを割り当てるものです。

これらのインスタンスは両方ともSquareオブジェクトです。

この線:

Monkey *george = [[Square alloc] init];

ジョージをサルにするために何もしません。彼は広場です。コンパイラは、Monkeyが応答しないメッセージを送信すると警告を表示しますが、Squareメッセージ(またはSquareのスーパークラス)の場合は、Squareとして応答します。

また、george Monkeyメッセージを送信すると、セレクターが見つからないというランタイムエラーが発生します。MonkeyメッセージがSquareメッセージと一致する場合を除きます(これは、一般的なスーパークラスのメソッドで発生します)。

それがポリモーフィズムです。ジョージはサル、サークル、または単なるIDであると主張できますが、彼は自分が何であるか、スクエアとして応答します。

于 2011-04-30T14:32:10.680 に答える
1

あなたは正しいです。ポインタのタイプは、オブジェクト自体のタイプには関係ありません。コンパイラが型をチェックしやすくするだけです。idすべてのオブジェクトに使用することもでき、それらの動作は変わりません。

于 2011-04-30T14:08:14.377 に答える