tôi nhận thấy rằng với các thông số tùy chọn trong C# 4 nếu bạn chỉ định một tham số là tùy chọn trên một giao diện bạn KHÔNG phải làm tham số tùy chọn trên bất kỳ lớp thực hiện:Tại sao các tham số tùy chọn C# 4 được xác định trên giao diện không được thực thi trên lớp triển khai?
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 thông số tùy chọn được thiết kế để hoạt động theo cách này không? Một mặt tôi cho rằng khả năng ghi đè lên bất kỳ giá trị mặc định nào được chỉ định trên giao diện là hữu ích mặc dù tôi thực sự không chắc chắn liệu bạn có thể chỉ định giá trị mặc định trên giao diện hay không. phán quyết.
Mặt khá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 bê tông và giao diện thay thế lẫn nhau. Điều này tất nhiên, sẽ không thành vấn đề nếu giá trị mặc định được chỉ định trên thực hiện, nhưng sau đó nếu bạn vạch trần lớp bê tông của mình làm giao diện (sử dụng một số khung IOC để tiêm lớp bê tông chẳng hạn) 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 cung cấp giá trị đó.
Vì chúng là tùy chọn? – Oded
Nhưng bạn có thể truyền đối tượng đối tượng sang 'MyInterface' và gọi nó với tham số tùy chọn:' ((MyInterface) obj) .TestMethod(); '. –
@oded - nhưng nếu bạn nói thông số này là tùy chọn trên hợp đồng, tại sao bạn cho phép người triển khai không làm cho tùy chọn đó trở thành tùy chọn? điều đó không chỉ gây nhầm lẫn cho bất kỳ ai muốn sử dụng hợp đồng? – theburningmonk