จากคำถามต่อไปนี้ที่ถามเมื่อไม่กี่วันที่ผ่านมาใน SO: GetType () และความหลากหลายและอ่านคำตอบของ Eric Lippertฉันเริ่มคิดว่าถ้าทำให้GetType()ไม่เสมือนจริงทำให้มั่นใจได้ว่าวัตถุไม่สามารถโกหกTypeได้
โดยเฉพาะคำตอบของ Eric ระบุสิ่งต่อไปนี้:
นักออกแบบเฟรมเวิร์กจะไม่เพิ่มคุณสมบัติที่อันตรายอย่างเหลือเชื่อเช่นการปล่อยให้วัตถุโกหกเกี่ยวกับประเภทของมันเพียงเพื่อให้มันสอดคล้องกับวิธีการอื่น ๆ อีกสามวิธีในประเภทเดียวกัน
ตอนนี้คำถามคือ: ฉันสามารถทำให้วัตถุที่ไม่โกหกเกี่ยวกับประเภทของมันโดยไม่ได้รับที่ชัดเจนได้ทันทีหรือไม่ ฉันอาจจะคิดผิดอย่างสุดซึ้งที่นี่และฉันชอบที่จะชี้แจงหากเป็นเช่นนั้น แต่ให้พิจารณารหัสต่อไปนี้:
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();
}
พอแน่ใจว่าผลผิดพลาดbadFooType
ตอนนี้ฉันไม่รู้ว่าสิ่งนี้มีผลกระทบร้ายแรงใด ๆ จากการที่เอริคอธิบายพฤติกรรมนี้ว่าเป็น " ลักษณะที่อันตรายอย่างไม่น่าเชื่อ " แต่รูปแบบนี้อาจเป็นภัยคุกคามที่น่าเชื่อถือได้หรือไม่