2012-04-01 8 views
0

を混乱させる私はアーカイブデータにアップ勉強して、そして私はしかし、私はNSMutableArrayをアーカイブする、標準のコレクションクラスは、簡単にアーカイブを提供実現「です」。だから、NSMutableArrayが "NSArray"なので、それはサブクラスなので、これはうまくいきます。サブクラスは、クラスが私に

しかし、そのアイデアの切り株私、そして私は、私は、私はそれが権利を取得確認する、これはObjective-Cの基本的な考え方であると認識。

あなたはサブクラスを持つクラス「自動車」があるとし、「ジープを。」ジープは、自動車のサブクラスであるので...

automobileInstance=jeepInstance;

:今以上に基づいて、あなたはこれを言うことができます。

しかし、これは私には逆のようです。

ジープ=自動

すべてのジープが自動車「である」、すべてではない自動車はジープされているため、後:私はあなたの代わりに、サブクラスのインスタンスは、スーパークラスのインスタンスと等しくなることができると言うべきだと思います。

は、なぜあなたはこれを行うことができます。

NSArray*newArray=nsmutableArrayInstance;

それは同じ考えだと言って:

automobile=jeep;私の例では。

例えば、あなたのサブクラスには多くの新しいインスタンス変数が追加されているかもしれませんが、スーパークラスと同じに設定した場合、それらのiVarsは "失われています"、または少なくともスーパークラスは認識しません本当にオブジェクトをキャプチャするように見えます。

スーパークラス内のすべてのサブクラスであるため、sublass instance = superclass instanceは、理にかなっていると言って、他の道を行きます。サブクラスにあるがスーパークラスにない余分なiVarsの値を取得しないだけで、デフォルトのゼロに設定されるかもしれませんが、少なくともそれらは存在します。

+1

Objective-Cは、英語の文構造に従いません。 –

+2

車の駐車場があると考えてください。ジープはそこに行くことができ、ジープは自動車です。あなたがジープのために特別に駐車場所を持っていた場合でも、あなたはちょうどあなた可能性、それに古いランダム自動車を貼り付けできませんでしたか?それはジープではないかもしれない。今、自動車*のauto'は(技術的には、ポインタ自動車に、しかしEH)自動車を置く場所を宣言 'ことを検討してください。もし駐車場があれば。 – cHao

答えて

1

このように考える:すべてのジープは自動車です。すべての自動車がジープです。ですから、あなたは言うことができます:

自動車a = jeepInstance; //ジープは常に自動車

でもない:

ジープJ = autoInstance。 //失敗する - autoInstanceはマツダかもしれない。スーパークラスのクラスメンバーはサブクラスで常に存在するため

1

スーパークラスのポインタは、サブクラスから割り当てられたオブジェクトを指すことができます。

autoMobilePointer = jeepObject; // works 

サブクラスにはスーパークラスには存在しないメンバーが存在するため、これは逆の言い方ではありません。

jeepPointer = autoMobileObject; // doesn't work 
+0

は、本質的にそれから、あなたの最初の例では、あなたの新しい自動ポインタが効果的にそう、それはautoMobilePointerを介してそれらにアクセスすることはできません – johnbakers

+0

ジープのいずれかのメンバーを失います。私はあなたができた後、jeepPointerにそのポインタをキャストする場合はかなり確信している - jeepObjectはあなたが後にすべてのメモリに割り当てられたものです。 –

1

ここでの問題は、あなたが割り当てと平等を混乱させていることと、多分クラスとオブジェクトだと思います。 =は代入を意味しますが、==-isEqualは等価性のテストです。BがAのサブクラスである場合、すべてのB はすべてのジープ自動車であり、すべての人間哺乳動物であるように、 Aです。

しかし、あなたが言うとき:

automobile = jeep; 

何をやっていることは変数automobileからjeepの値を割り当てるです。あなたはではありません世界のすべての自動車はジープです、あなたは特定の変数automobileがジープの特定のインスタンスを指していると言っています。それはちょうど私があなたに尋ねたかのようです:

どの車を運転しますか?

私の頭の中で、あなたは車に関する情報を返信すると期待しています。あなたの答えのために私が予約した私の頭の中の記憶場所は、それがどんな車をも参照できるので、タイプAutomobile*と言うことができます。返信:

私はその赤いジープを木の近くに駐車しています。

それはあなたの変数のため、より説明的な名前を選択するのに役立つかもしれません。

Automobile *theCarThatAndrewxDrives = jeep; 

これは、すべての車ではなく、特定の1つの車について話していることを明らかにしています。

関連する問題