Opierając się na pytaniu zadanym kilka dni temu w SO: GetType () i polimorfizmie oraz czytając odpowiedź Erica Lipperta , zacząłem się zastanawiać, czy tworzenie GetType()nie jest wirtualne naprawdę zapewni, że obiekt nie może kłamać na jego temat Type.
W szczególności odpowiedź Erica brzmi następująco:
Projektanci frameworka nie zamierzają dodawać niewiarygodnie niebezpiecznej funkcji, takiej jak pozwalanie obiektowi kłamać na temat jego typu, tylko po to, aby był zgodny z trzema innymi metodami tego samego typu.
Teraz pytanie brzmi: czy mogę stworzyć obiekt, który kłamie na temat swojego typu, nie będąc od razu oczywistym? Mogę się tutaj głęboko mylić i chciałbym wyjaśnić, jeśli tak jest, ale weź pod uwagę następujący kod:
public interface IFoo
{
Type GetType();
}
I następujące dwie implementacje wspomnianego interfejsu:
public class BadFoo : IFoo
{
Type IFoo.GetType()
{
return typeof(int);
}
}
public class NiceFoo : IFoo
{
}
Następnie, jeśli uruchomisz następujący prosty program:
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();
}
Z pewnością badFoowyprowadza błąd Type.
Teraz nie wiem, czy ma to jakieś poważne konsekwencje, ponieważ Eric opisuje to zachowanie jako „ niezwykle niebezpieczną cechę ”, ale czy ten wzorzec może stanowić wiarygodne zagrożenie?