La sortie est Bar-Bar-Quux, résultat de 3 appels à GetName() dans votre appel à la méthode Console.WriteLine.
Bar f1 = new Baz();
IFoo f2 = new Baz();
IFoo f3 = new Quux();
Console.WriteLine(f1.GetName() + "-" + f2.GetName() + "-" + f3.GetName());
//Bar-Bar-Quux
Examinons chaque appel afin de mieux comprendre ce qui se passe.
f1.GetName()
f1
est instancié en tant que Baz
. Cependant c'est dactylographié como Bar
. Parce que Bar
expose GetName
quand f1.GetName()
est utilisée, c'est la méthode qui est appelée - indépendamment de du fait que Baz
met également en œuvre GetName
. La raison en est que f1
n'est pas typée comme Baz
et si c'était le cas, il appellerait Baz
's GetName
méthode. Un exemple de cela serait d'examiner la sortie de
Console.WriteLine(((Baz)f1).GetName() + "-" + f2.GetName() + "-" + f3.GetName());
//Baz-Bar-Quux
Cela est possible grâce à deux faits. Premièrement, f1
a été initialement instancié en tant que Baz
il a été simplement tapé comme Bar
. Deuxièmement, Baz
fait ont un GetName
et l'utilisation de la méthode new
dans sa définition cache l'héritage Bar
's GetName
méthode permettant Baz
's GetName
pour être appelé.
f2.GetName()
Un typage très similaire se produit avec f2
qui est défini comme suit
IFoo f2 = new Baz();
Bien que la classe Baz implémente un GetName
il ne met pas en œuvre la méthode IFoo
's GetName
car Baz
n'hérite pas de IFoo
et donc la méthode n'est pas disponible. Bar
met en œuvre IFoo
et puisque Baz
hérite de Bar
, Bar
's GetName
est la méthode qui est exposée lorsque f2
est tapé comme IFoo
.
Encore une fois, puisque f2
a été initialement instancié en tant que Baz
il peut toujours être transformé en Baz
.
Console.WriteLine(f1.GetName() + "-" + ((Baz)f2).GetName() + "-" + f3.GetName());
//Bar-Baz-Quux
Et aura le même résultat de sortie pour la raison indiquée ci-dessus pour f1
( f2
était à l'origine tapé comme Baz
y Baz
's GetName
cache la méthode héritée Bar
's GetName
méthode).
f3.GetName()
C'est une histoire différente ici. Quux
fait hériter et mettre en œuvre IFoo
, et il se cache Bar
La mise en œuvre de l IFoo
en utilisant new
. Le résultat est que Quux
's GetName
est celle qui est appelée.