Basé sur la question suivante posée il y a quelques jours, dans: GetType() et le polymorphisme et de la lecture Eric Lippert la réponse, j'ai commencé à penser si GetType()
de ne pas être virtuel vraiment fait en sorte qu'un objet ne peut pas mentir à propos de son Type
.
Plus précisément, Eric réponse est la suivante:
Le cadre concepteurs ne vont pas à ajouter un incroyablement dangereux comme permettant un objet à mentir à propos de son type, simplement pour le rendre compatible avec les trois autres méthodes du même type.
Maintenant, la question est: puis-je faire un objet qui ne se mentir à propos de son type, sans qu'il soit immédiatement évident? J'ai peut-être profondément mal ici, et j'aimerais des précisions si c'est le cas, mais considérons le code suivant:
public interface IFoo
{
Type GetType();
}
Et dans les deux implémentations de ladite interface:
public class BadFoo : IFoo
{
Type IFoo.GetType()
{
return typeof(int);
}
}
public class NiceFoo : IFoo
{
}
Alors 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();
}
Assurez-vous de suffisamment d' badFoo
sorties erronée Type
.
Maintenant, je ne sais pas si cela a une incidence sérieuse basée sur Eric décrivant ce comportement comme "incroyablement dangereux fonctionnalité", mais ce modèle pourrait poser une menace crédible?