Berdasarkan pertanyaan berikut yang diajukan beberapa hari yang lalu di SO: GetType () dan polimorfisme serta membaca jawaban Eric Lippert , saya mulai berpikir jika menjadikan GetType()tidak virtual benar-benar memastikan bahwa suatu objek tidak dapat berbohong tentangnya Type.
Secara spesifik, jawaban Eric menyatakan sebagai berikut:
Perancang kerangka tidak akan menambahkan fitur yang sangat berbahaya seperti membiarkan objek berbohong tentang tipenya hanya untuk membuatnya konsisten dengan tiga metode lain pada tipe yang sama.
Sekarang pertanyaannya adalah: dapatkah saya membuat sebuah objek yang benar - benar berbohong tentang tipenya tanpa membuatnya terlihat jelas? Saya mungkin sangat salah di sini dan saya ingin klarifikasi jika itu masalahnya, tetapi pertimbangkan kode berikut:
public interface IFoo
{
Type GetType();
}
Dan dua implementasi berikut dari antarmuka tersebut:
public class BadFoo : IFoo
{
Type IFoo.GetType()
{
return typeof(int);
}
}
public class NiceFoo : IFoo
{
}
Kemudian jika Anda menjalankan program sederhana berikut:
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();
}
Benar saja badFookeluaran yang salah Type.
Sekarang saya tidak tahu apakah ini memiliki implikasi serius berdasarkan Eric yang menggambarkan perilaku ini sebagai " fitur yang sangat berbahaya ", tetapi dapatkah pola ini menimbulkan ancaman yang dapat dipercaya?