En me basant sur la question suivante posée il y a quelques jours dans SO: GetType () et le polymorphisme et en lisant la réponse d' Eric Lippert , j'ai commencé à GetType()me demander si le fait de ne pas être virtuel assurait vraiment qu'un objet ne pouvait pas mentir à son sujet Type.
Plus précisément, la réponse d'Eric déclare ce qui suit:
Les concepteurs de framework ne vont pas ajouter une fonctionnalité incroyablement dangereuse telle que permettre à un objet de mentir sur son type simplement pour le rendre cohérent avec trois autres méthodes sur le même type.
Maintenant , la question est: puis - je faire un objet qui ne mentir sur son type sans qu'il soit immédiatement évident? Je me trompe peut-être profondément et j'aimerais avoir des éclaircissements si tel est le cas, mais considérez le code suivant:
public interface IFoo
{
Type GetType();
}
Et les deux implémentations suivantes de ladite interface:
public class BadFoo : IFoo
{
Type IFoo.GetType()
{
return typeof(int);
}
}
public class NiceFoo : IFoo
{
}
Ensuite, si vous exécutez le programme simple suivant:
static void Main(string[] args)
{
IFoo badFoo = new BadFoo();
IFoo niceFoo = new NiceFoo();
Console.WriteLine("BadFoo says he's a '{0}'", badFoo.GetType().ToString());
Console.WriteLine("NiceFoo says he's a '{0}'", niceFoo.GetType().ToString());
Console.ReadLine();
}
Bien sûr, badFoogénère une erreur Type.
Maintenant, je ne sais pas si cela a des implications sérieuses basées sur Eric décrivant ce comportement comme une " caractéristique incroyablement dangereuse ", mais ce modèle pourrait-il constituer une menace crédible?
IFoo.GetTypeet ce object.GetTypen'est pas la même chose donc rien de mal ne se passe ici sauf un style médiocre. Edit: Généralement, GetTypeil sera appelé sur un objet inconnu au moment de la compilation, dans la plupart des cas objectet non sur une interface douteuse. :)
GetType, avec la même signature. Cela ne concerne pas la GetTypeméthode qui est importante. Vous pouvez également créer une méthode d'instance publique qui masque la GetTypeméthode appropriée , à l'aide du newmot-clé modifier. Notez que si vous avez une méthode générique comme static Type Test<T>(T t) { return t.GetType(); }(sans contrainte T), alors des trucs comme Test<IFoo>(new BadFoo())appelleront toujours la GetTypeméthode d' origine .