Основываясь на следующем вопросе, заданном несколько дней назад в SO: GetType () и полиморфизм, и прочитав ответ Эрика Липперта , я начал думать, действительно ли создание GetType()виртуального объекта не гарантирует, что объект не может лгать о нем Type.
В частности, в ответе Эрика говорится следующее:
Разработчики фреймворка не собираются добавлять невероятно опасную функцию, такую как разрешение объекту лгать о своем типе только для того, чтобы согласовать его с тремя другими методами того же типа.
Теперь вопрос: могу ли я создать объект, который лжет о своем типе, не будучи сразу очевидным? Я могу ошибаться здесь и хотел бы получить разъяснения, если это так, но рассмотрите следующий код:
public interface IFoo
{
Type GetType();
}
И следующие две реализации указанного интерфейса:
public class BadFoo : IFoo
{
Type IFoo.GetType()
{
return typeof(int);
}
}
public class NiceFoo : IFoo
{
}
Затем, если вы запустите следующую простую программу:
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();
}
Конечно же, badFooвыводит ошибочный Type.
Я не знаю, имеет ли это какое-либо серьезное значение на основании того, что Эрик описывает такое поведение как « невероятно опасную особенность », но может ли этот шаблон представлять реальную угрозу?