Basado en la siguiente pregunta hecha hace unos días en SO: GetType () y polimorfismo y leyendo la respuesta de Eric Lippert , comencé a pensar si hacer GetType()no ser virtual realmente garantizaba que un objeto no pudiera mentir sobre su Type.
Específicamente, la respuesta de Eric dice lo siguiente:
Los diseñadores de frameworks no van a agregar una característica increíblemente peligrosa como permitir que un objeto mienta sobre su tipo simplemente para que sea consistente con otros tres métodos del mismo tipo.
Ahora la pregunta es: ¿Puedo hacer un objeto que hace mentira acerca de su tipo, sin que sea inmediatamente obvio? Puede que esté profundamente equivocado aquí y me encantaría una aclaración si ese es el caso, pero considere el siguiente código:
public interface IFoo
{
Type GetType();
}
Y las siguientes dos implementaciones de dicha interfaz:
public class BadFoo : IFoo
{
Type IFoo.GetType()
{
return typeof(int);
}
}
public class NiceFoo : IFoo
{
}
Entonces, si ejecuta el siguiente programa simple:
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();
}
Efectivamente, badFoogenera un error Type.
Ahora bien, no sé si esto tiene implicaciones serias basándome en que Eric describió este comportamiento como una " característica increíblemente peligrosa ", pero ¿podría este patrón representar una amenaza creíble?
IFoo.GetTypey object.GetTypeno es lo mismo, así que aquí no pasa nada malo excepto el estilo pobre. Editar: generalmente GetTypese llamará a algún objeto desconocido en tiempo de compilación, en la mayoría de los casos objecty no a una interfaz poco fiable. :)
GetType, con la misma firma. Eso no se relaciona con el GetTypemétodo que es importante. También puede crear un método de instancia pública que oculte el GetTypemétodo relevante , utilizando la newpalabra clave modificadora. Tenga en cuenta que si tiene un método genérico como static Type Test<T>(T t) { return t.GetType(); }(sin restricciones T), entonces cosas como Test<IFoo>(new BadFoo())seguirán llamando al GetTypemétodo original .