2010-07-29 12 views
2

En C# .NET, j'ai 2 classes concrètes. Classe A et B. Classe B est une sous-classe de la classe A.Combien d'instances et de références sont créées pour une classe Base-Sub?

Combien d'instances (objets sur le tas) et les références de la pile des objets de tas sont créés pour chaque ligne de code:

  1. ClassB b = new ClassB();

  2. ClassA a = new ClassB();

+0

Ce serait deux instances. Chaque utilisation de 'new' est égale à un objet instancié. –

Répondre

4

Voulez-vous profiter de l'analogie que l'objet est un ballon et la référence est une chaîne est lié à la baloon, dans chacun des cas suivants il y aurait un balolon et une chaîne:

ClassB b = new ClassB(); //one reference, one heap object 
ClassA a = new ClassB(); //one reference, one heap object 

Courir les deux en même temps va donc créer deux objets et deux références.

EDIT Jetez un oeil à cette IL produite à partir ClassB constructeur:

.method public hidebysig specialname rtspecialname 
     instance void .ctor() cil managed 
{ 
    // Code size  7 (0x7) 
    .maxstack 8 
    IL_0000: ldarg.0 
    IL_0001: call  instance void InheritanceTest.ClassA::.ctor() 
    IL_0006: ret 
} // end of method ClassB::.ctor 

call instance void InheritanceTest.ClassA::.ctor() indique qu'il appelle ClassA constructeur en fonction de membre (non en fonction d'un objet membre). Ceci est en accord avec ma compréhension de ce qui se passe avec les instances de classes héritées, que la classe dérivée est simplement tous les membres de la classe de base, suivis de ses propres membres, de la même manière que C++.

+0

Un de mes collègues a soutenu que la création d'une instance de ClassB va créer 2 objets (ClassA et ClassB) car les constructeurs des deux objets ont été appelés. Je veux savoir si c'est correct – rro

+0

Il n'est pas correct, ce n'est pas comment l'héritage fonctionne en C#. –

+0

Merci. Je ferais mieux de commencer à plonger dans le code IL plus souvent. – rro

-1

Dans le premier cas - vous n'aurez qu'une instance de classe B. Dans le second cas, vous aurez une instance de classe B. L'instance de classe A ne sera pas créée dans le second cas.

+0

'new ClassB()' crée une nouvelle instance de ClassB, malgré tout. Ce qui arrive à cette instance dépend du programme. Dans ce cas, une référence à l'instance est stockée dans une référence 'ClassA'. Mais c'est toujours une instance de 'ClassB' –

+0

@Matt, Merci de souligner. C'était une faute de frappe. Corrigée. – matrix

0

Cela dépend vraiment de ce que les membres sont dans chaque classe. Supposons qu'ils soient des classes vides, une référence par objet, pour un total de deux. En d'autres termes, la création d'un objet ClassB ne crée pas plus de références que lui-même.

S'ils ont des membres, bien sûr, il y a des références supplémentaires pour les membres, mais je pense que ce n'est pas l'essentiel de votre question.