Tôi cần tạo quá tải cho các chức năng trên giao diện hiện tại mà không ảnh hưởng đến bất kỳ thành phần nào hiện đang triển khai hoặc sử dụng giao diện (lý tưởng).Thêm chức năng mới vào giao diện
tôi con tôi có một vài lựa chọn:
Giản gốc giao diện:
public interface IServerComponent
{
bool Add(int a, int b);
}
tôi có thể thêm các chức năng quá tải mới cho giao diện và buộc mỗi lớp mà thực hiện giao diện để thực hiện các chức năng mới.
public interface IServerComponent
{
bool Add(int a, int b);
bool Add(int a, int b, int c);
}
Hoặc tôi có thể tạo giao diện mới triển khai giao diện gốc. Sau đó, các lớp khác sử dụng bản gốc sẽ không cần thay đổi và bất kỳ lớp học mới nào có thể triển khai giao diện mới ...
public interface IServerComponent2 : IServerComponent
{
bool Add(int a, int b, int c);
}
Thực tiễn tốt nhất là tình huống này là gì? Có bất kỳ tùy chọn nào khác không?
Cảm ơn
+1 để đề cập đến các phương pháp mở rộng – ram
Phương pháp mở rộng sẽ hoạt động, nhưng cũng sẽ có tác dụng lan truyền chức năng của lớp thực hiện giảm sự gắn kết. Tôi thấy điều này như một giải pháp tạm thời ở mức tốt nhất. Trong trường hợp bạn không thể mở rộng lớp, vì bạn không có quyền truy cập vào nguồn, thì các phương thức mở rộng có ý nghĩa. Tôi có thể làm theo cách này cho các cập nhật nhỏ cho một cơ sở mã hiện có, nhưng tôi chắc chắn sẽ đặt nó vào danh sách các phép tái cấu trúc cho bản phát hành chính tiếp theo. – tvanfosson
Điều này hoàn toàn phụ thuộc vào thiết kế. Nếu bạn đang thêm * chức năng mới *, thì tôi đồng ý; nó thuộc về một giao diện. Nếu bạn đang thêm * quá tải * (ví dụ: chức năng gần như giống hệt nhau, luôn thể hiện được về các chức năng khác), thì tôi không đồng ý. Trong trường hợp này, các phương thức mở rộng cho phép * trực giao *, giảm trùng lặp mã. [Joe Duffy] (http://www.bluebytesoftware.com/blog/2010/02/10/ExtensionMethodsAsDefaultInterfaceMethodImplementations.aspx) có một bài đăng trên blog tốt về chủ đề này. –