Tôi nhận thấy rằng với các tham số tùy chọn trong C # 4 nếu bạn chỉ định một tham số tùy chọn trên giao diện bạn không, bạn phải đặt tham số đó tùy chọn trên bất kỳ lớp triển khai nào:
public interface MyInterface
{
void TestMethod(bool flag = false);
}
public class MyClass : MyInterface
{
public void TestMethod(bool flag)
{
Console.WriteLine(flag);
}
}
và do đó:
var obj = new MyClass();
obj.TestMethod(); // compiler error
var obj2 = new MyClass() as MyInterface;
obj2.TestMethod(); // prints false
Có ai biết tại sao các tham số tùy chọn được thiết kế để làm việc theo cách này?
Một mặt, tôi cho rằng khả năng ghi đè bất kỳ giá trị mặc định nào được chỉ định trên các giao diện là hữu ích mặc dù thành thật mà nói tôi không chắc liệu bạn có thể chỉ định các giá trị mặc định trên giao diện hay không vì đó là một quyết định triển khai.
Mặt khác, việc ngắt kết nối này có nghĩa là bạn không thể luôn sử dụng lớp cụ thể và giao diện thay thế cho nhau. Tất nhiên, điều này sẽ không thành vấn đề nếu giá trị mặc định được chỉ định khi triển khai, nhưng sau đó nếu bạn hiển thị lớp cụ thể của mình dưới dạng giao diện (ví dụ sử dụng một khung IOC để tiêm lớp cụ thể) thì thực sự không có điểm có giá trị mặc định là người gọi sẽ phải luôn luôn cung cấp nó.
MyInterface
và gọi nó với tham số tùy chọn : ((MyInterface)obj).TestMethod();
.