0

私が恐れているちょっとした初心者の質問です。つまり、オブジェクトのサブクラスを作成するかどうかを知りたい場合、親クラスのインスタンスを使用して、そのオブジェクトの親クラスのプロパティのみを参照できますか? もしそうなら、サブクラスと親の間を自由に行き来できますか?

たとえば、B を A のサブタイプとして定義すると、A にはメソッド a があり、B にはメソッド b があります。

B のインスタンスを作成し、それをオブジェクト タイプ A として参照できますか

並べ替え: B *b1; B *b2; A *a;

b1 = [[B alloc] init];

// Is this allowed?
a = (A *)b1;
b2= (B *)a;

// Are these valid?
[ a a];
[ b2 a];
[ b2 b];

(Web で一般的なサブクラス化に関する多くの議論を見てきましたが、クラスとそのスーパークラスの間でいつ変換できるかを説明しているようには見えません)

4

3 に答える 3

1

すべては実行時に解決されます。にメッセージを送信するaと、にキャストするかどうかに関係なく、同じ結果が得られますA*

つまり、キャストは違いを生みません。必要に応じてそれらをキャストすることもできましたがNSString*、それでもすべて機能します。

一方、ARC では、オブジェクトが送信されたメッセージに応答しないように見える場合、コンパイル時エラーが発生します。

于 2012-09-16T08:07:31.343 に答える
0

最初のキャストについて 100% 確信があるわけではありませんが、どちらのキャストも合法だと思います。b12 番目のキャストは、元のオブジェクトが type である限り意味がありBます。そうしないと、Bメッセージを送信するb2とエラーが発生します-そのタイプに実装されていないメソッドのオブジェクトにメッセージが送信されたときに呼び出されるメソッドのデフォルトの実装があったと思います。

さらに、これら 3 つのメッセージを送信することも合法です。メソッドaは class に対して public であるため、タイプおよびAのオブジェクトはmessage に応答します。も応答します。これは、実際には 型のオブジェクトを指しているためです。ABab2bB

于 2012-09-16T08:04:30.317 に答える
0
b1 = [[B alloc] init];
a = (A *)b1;
b2= (B *)a;

要約すると、単一のオブジェクトがb1あり、それへの 2 つの参照ab2.

以前はクラスのインスタンスだったにもかかわらず、クラスBのメソッドを呼び出すことができるかどうかを知りたいですか?b2A

3 つのオブジェクトはすべてクラス B のインスタンスであるため、答えは YES です。ある型から別の型へのキャストは、メソッド呼び出しを解決する方法をコンパイラに示す指標です。

たとえば、次のように記述した場合:

id obj = b1;

後でクラス B のプロパティにアクセスしようとします。

obj.someProperty;

コンパイラの警告が表示されますが、キャストした場合:

(B *)obj.someProperty;

コンパイラに情報を提供したため、警告は表示されません。

Objective-C は動的言語です。3 つのオブジェクトはすべて class のインスタンスですB。それらを他のクラスにキャストしても、クラスは変更されません。

于 2012-09-16T08:06:30.517 に答える