ฉันสังเกตเห็นว่าด้วยพารามิเตอร์ที่เป็นตัวเลือกใน C # 4 หากคุณระบุพารามิเตอร์ที่เป็นตัวเลือกบนอินเทอร์เฟซที่คุณไม่ต้องทำให้พารามิเตอร์นั้นเป็นตัวเลือกในชั้นเรียนการใช้งานใด ๆ :
public interface MyInterface
{
void TestMethod(bool flag = false);
}
public class MyClass : MyInterface
{
public void TestMethod(bool flag)
{
Console.WriteLine(flag);
}
}
และดังนั้นจึง:
var obj = new MyClass();
obj.TestMethod(); // compiler error
var obj2 = new MyClass() as MyInterface;
obj2.TestMethod(); // prints false
ไม่มีใครรู้ว่าทำไมพารามิเตอร์ที่ไม่จำเป็นได้รับการออกแบบมาเพื่อทำงานในลักษณะนี้?
ในมือข้างหนึ่งฉันคิดว่าความสามารถในการแทนที่ค่าเริ่มต้นใด ๆ ที่ระบุบนอินเทอร์เฟซมีประโยชน์แม้ว่าจะซื่อสัตย์ฉันไม่แน่ใจว่าคุณควรจะสามารถระบุค่าเริ่มต้นบนอินเทอร์เฟซได้เช่นกัน
ในทางกลับกันการตัดการเชื่อมต่อนี้หมายความว่าคุณไม่สามารถใช้คลาสคอนกรีตและอินเทอร์เฟซแทนกันได้เสมอ แน่นอนนี้จะไม่มีปัญหาหากมีการระบุค่าเริ่มต้นในการใช้งาน แต่ถ้าคุณเปิดเผยคลาสคอนกรีตของคุณเป็นอินเทอร์เฟซ (โดยใช้กรอบ IOC บางกรอบเพื่อฉีดคลาสคอนกรีตเป็นต้น) จริงๆแล้วไม่มี ชี้ที่มีค่าเริ่มต้นเป็นผู้โทรจะต้องให้มันเสมอ
MyInterface
((MyInterface)obj).TestMethod();