ทำไมพฤติกรรมของวิธีการเชื่อมต่อเริ่มต้นเปลี่ยนไปใน C # 8 ในอดีตรหัสต่อไปนี้ (เมื่อวิธีการอินเทอร์เฟซเริ่มต้นถูกสาธิตไม่ออก):
interface IDefaultInterfaceMethod
{
// By default, this method will be virtual, and the virtual keyword can be here used!
virtual void DefaultMethod()
{
Console.WriteLine("I am a default method in the interface!");
}
}
interface IOverrideDefaultInterfaceMethod : IDefaultInterfaceMethod
{
void IDefaultInterfaceMethod.DefaultMethod()
{
Console.WriteLine("I am an overridden default method!");
}
}
class AnyClass : IDefaultInterfaceMethod, IOverrideDefaultInterfaceMethod
{
}
class Program
{
static void Main()
{
IDefaultInterfaceMethod anyClass = new AnyClass();
anyClass.DefaultMethod();
IOverrideDefaultInterfaceMethod anyClassOverridden = new AnyClass();
anyClassOverridden.DefaultMethod();
}
}
มีเอาต์พุตต่อไปนี้:
เอาต์พุตคอนโซล:
ฉันเป็นวิธีการเริ่มต้นในอินเทอร์เฟซ!
ฉันเป็นวิธีเริ่มต้นที่ถูกแทนที่!
แต่ด้วยเวอร์ชันล่าสุดของ C # 8 โค้ดด้านบนกำลังสร้างเอาต์พุตต่อไปนี้:
เอาต์พุตคอนโซล:
ฉันเป็นวิธีเริ่มต้นที่ถูกแทนที่!
ฉันเป็นวิธีเริ่มต้นที่ถูกแทนที่!
ทุกคนสามารถอธิบายให้ฉันฟังได้ว่าทำไมพฤติกรรมนี้ถึงเปลี่ยนไป
บันทึก:
IDefaultInterfaceMethod anyClass = new AnyClass(); anyClass.DefaultMethod();
((IDefaultInterfaceMethod) anyClass).DefaultMethod(); // STILL the same problem!??
Cut base() syntax for C# 8. We intend to bring this back in the next major release.
8 สิ่งนี้ต้องการการสนับสนุนรันไทม์เพื่อให้ทำงานได้อย่างถูกต้อง
virtual
ผมคิดว่า? และอาจแนะนำเพชรมรดก