Com base na seguinte pergunta feita há poucos dias no SO: GetType () e polimorfismo e lendo a resposta de Eric Lippert , comecei a pensar se fazer GetType()não ser virtual realmente garante que um objeto não possa mentir sobre ele Type.
Especificamente, a resposta de Eric afirma o seguinte:
Os designers do framework não irão adicionar um recurso incrivelmente perigoso, como permitir que um objeto minta sobre seu tipo apenas para torná-lo consistente com três outros métodos do mesmo tipo.
Agora a pergunta é: Eu posso fazer um objeto que faz mentira sobre seu tipo, sem que seja imediatamente óbvio? Posso estar profundamente errado aqui e adoraria um esclarecimento se for esse o caso, mas considere o seguinte código:
public interface IFoo
{
Type GetType();
}
E as seguintes duas implementações da referida interface:
public class BadFoo : IFoo
{
Type IFoo.GetType()
{
return typeof(int);
}
}
public class NiceFoo : IFoo
{
}
Então, se você executar o seguinte programa simples:
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();
}
Com certeza badFooproduz um erro Type.
Agora, eu não sei se isso tem alguma implicação séria com base na descrição de Eric desse comportamento como um " recurso incrivelmente perigoso ", mas esse padrão poderia representar uma ameaça confiável?
IFoo.GetTypee object.GetTypenão é a mesma coisa, então nada de ruim está acontecendo aqui, exceto um estilo ruim. Editar: Geralmente GetTypeserá chamado em algum objeto desconhecido em tempo de compilação, na maioria dos casos, objecte não em alguma interface duvidosa. :)
GetType, com a mesma assinatura. Isso não se relaciona com o GetTypemétodo que é importante. Você também pode criar um método de instância público que oculte o GetTypemétodo relevante , usando a newpalavra-chave modificadora. Observe, se você tiver um método genérico como static Type Test<T>(T t) { return t.GetType(); }(sem restrição T), então coisas como Test<IFoo>(new BadFoo())ainda chamarão o GetTypemétodo original .