コメントを読めば、クラスCのインスタンスを作成するときに、クラスB、A、またはオブジェクトのインスタンスが別々に存在すると誤解されるようです。そうではありません。クラスCのインスタンスである単一のオブジェクトがあり、クラスB、A、またはオブジェクトのインスタンスとして扱うこともできます(Liskov Substitution Principleで読んでください)。 Eric Lippertの類推を変えるには:犬が生まれたとき(生まれて)、それは犬、哺乳動物、動物です。しかし、唯一の犬があります。
検討この(動物、哺乳類、犬、代わりのA、B、C):
public class Animal
{
void Breathe();
}
public class Mammal : Animal
{
void GrowHair();
}
public class Dog
{
void Bark();
}
この継承チェーンは以下の効果が得られる:、フィールドの観点から
public class C
{
void Breathe();
void GrowHair();
void Bark();
}
および
public class A
{
private int _a;
}
public class B: A
{
private int _b;
}
public class C: B
{
private int _c;
}
Aのインスタンスはどのようにメモリ内を見ますか?A、B、Cに戻る_a
のためのオーバーヘッドのバイトに加え、4バイトのいくつかの数:
OVERHEAD
_a : four bytes
どのようにして、メモリ内のBの外観のインスタンス?それはちょうどAプラス4バイト以上のインスタンスのようになります。
OVERHEAD
_a : four bytes
_b : four bytes
そして、Cのインスタンスは、Aプラス8バイト以上のインスタンスのようになります。
OVERHEAD
_a : four bytes
_b : four bytes
_c : four bytes
そのオーバーヘッドは何ですか?当然、は、Object
クラスで定義されたものです!したがって、継承チェーンに別のクラスを追加するたびに、そのクラスで定義されたフィールドは、親クラスのメモリ構造の最後に追加されます。
派生クラスのインスタンスがでない場合は、親クラスによって定義されたデータをと参照してください。 には、親クラスによって定義されたデータがに含まれています。
「参照先」とはどういう意味ですか?クラスCのオブジェクトは、クラスAからだけでなく、クラスBからも継承されます。 – Blorgbeard
クラスcのオブジェクトが作成されたときを参照してください。最初にクラスsystem.objectのオブジェクトが作成され(最高レベルの基本クラスとして)、そのオブジェクトへの参照がSOMEWHEREに送信されなければなりません(このrefrenceはどこにありますか?)、クラスAのオブジェクトが作成され、それへのrefrecneはどこかどこに送信しなければならない、次に階層Bのオブジェクトは、このオブジェクトのアドレスを作成しなければなりません最終的に送信されなければならないCクラスのオブジェクトが作成され、ここで私の質問は、 (Cが派生したすべてのクラスの参照) –
いいえ..インスタンスが1つしかなく、クラスCです。このオブジェクトは「C」です - したがって、B、A、およびシステムです.Object - それはCであることが意味するものの一部です。 – Blorgbeard