La bonne façon de penser est d'imaginer que chaque classe exige de ses objets ont un certain nombre de "slots"; ces emplacements sont remplis avec des méthodes. À la question "quelle méthode est appelée?" vous demande de comprendre deux choses:
- Quel est le contenu de chaque fente?
- Slot est appelé?
Nous allons commencer par examiner les fentes. Il y a deux fentes. Toutes les instances d'Un sont tenus d'avoir un logement, que nous appellerons GetNameSlotA. Toutes les instances de C sont tenus d'avoir un logement, que nous appellerons GetNameSlotC. C'est ce que le "nouveau" signifie à la déclaration en C, cela veut dire "je veux une nouvelle machine à sous". Par rapport à la "remplacer" sur la déclaration en B, ce qui signifie "je ne veux pas d'une nouvelle machine à sous, je veux re-utiliser GetNameSlotA".
Bien sûr, C hérite de A, alors C doit également avoir un logement GetNameSlotA. Par conséquent, les instances de C ont deux fentes -- GetNameSlotA, et GetNameSlotC. Les Instances de A ou de B qui ne sont pas C ont un logement, GetNameSlotA.
Maintenant, ce qui se passe dans ces deux fentes lorsque vous créez un nouveau C? Il existe trois méthodes, que nous appellerons GetNameA, GetNameB, et GetNameC.
La déclaration d'Un dit "mettre GetNameA dans GetNameSlotA". A est une super-classe de C, si Une règle s'applique à C.
La déclaration de B dit "mettre GetNameB dans GetNameSlotA". B est une super-classe de C, donc B est la règle s'applique dans les cas de C. Maintenant, nous avons un conflit entre A et B. B est la plus dérivée, donc il gagne -- B de la règle remplace Une règle. Par conséquent, le mot "remplacer" dans la déclaration.
La déclaration de C dit "mettre GetNameC dans GetNameSlotC".
Par conséquent, votre nouveau C aura deux fentes. GetNameSlotA contiendra GetNameB et GetNameSlotC contiendra GetNameC.
Nous avons maintenant déterminé quelles sont les méthodes en ce que des fentes, de sorte que nous avons répondu à notre première question.
Maintenant, nous devons répondre à la seconde question. Ce slot est appelé?
Pensez que vous êtes le compilateur. Vous disposez d'une variable. Tout ce que vous savez à ce sujet est qu'il est de type A. Vous êtes invité à résoudre un appel de méthode sur cette variable. Vous regardez les machines à sous disponibles sur l'Un, et la seule fente que vous pouvez trouver qui correspond à est GetNameSlotA. Vous ne savez pas à propos de GetNameSlotC, car vous avez seulement une variable de type A; pourquoi voudriez-vous regarder pour les logements qui ne s'appliquent qu'à C?
Donc ceci est un appel à tout ce qui est en GetNameSlotA. Nous avons déjà déterminé que, au moment de l'exécution, GetNameB sera dans cet emplacement. Donc, ceci est un appel à GetNameB.
L'emporter clé ici est que en C# résolution de surcharge choisit une fente et génère un appel à tout ce qui se trouve dans cet emplacement.