Исходя из следующего вопроса, заданного несколько дней назад в 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 a '{0}'", badFoo.GetType().ToString());
Console.WriteLine("NiceFoo says he a '{0}'", niceFoo.GetType().ToString());
Console.ReadLine();
}
Конечно, badFoo
выводит ошибочный Type
.
Теперь я не знаю, имеет ли это какие-либо серьезные последствия, основанные на Эрике, описывающем это поведение как "невероятно опасную функцию", но может ли этот шаблон создать надежную угрозу?