Explicit interface implementation không cho phép bạn chỉ định bất kỳ công cụ sửa đổi truy cập nào. Khi bạn thực hiện một thành viên giao diện một cách rõ ràng (bằng cách chỉ định tên giao diện trước tên thành viên), bạn có thể truy cập thành viên đó chỉ sử dụng giao diện. Về cơ bản, nếu bạn làm:
System.Collections.Specialized.StringDictionary IWorkItemControl.Properties
{
get { return properties; }
set { properties = value; }
}
Bạn có thể không cần làm:
MyClass x = new MyClass();
var test = x.Properties; // fails to compile
// You should do:
var test = ((IWorkItemControl)x).Properties; // accessible through the interface
Có một số trường hợp sử dụng cho EII. Ví dụ: bạn muốn cung cấp phương thức Close
cho lớp học của mình để giải phóng tài nguyên có được nhưng bạn vẫn muốn triển khai IDisposable
. Bạn có thể làm:
class Test : IDisposable {
public void Close() {
// Frees up resources
}
void IDisposable.Dispose() {
Close();
}
}
Bằng cách này, người tiêu dùng của lớp chỉ có thể gọi trực tiếp Close
(và họ thậm chí sẽ không thấy Dispose
trong danh sách Intellisense) nhưng bạn vẫn có thể sử dụng lớp Test
bất cứ nơi nào một IDisposable
dự kiến (ví dụ: trong câu lệnh using
).
Một trường hợp sử dụng cho EII đang cung cấp triển khai khác nhau của một thành viên giao diện hệt tên cho hai giao diện:
interface IOne {
bool Property { get; }
}
interface ITwo {
string Property { get; }
}
class Test : IOne, ITwo {
bool IOne.Property { ... }
string ITwo.Property { ... }
}
Như bạn thấy, mà không EII nó thậm chí không thể để thực hiện cả hai giao diện của ví dụ này trong một lớp đơn (vì các thuộc tính chỉ khác nhau về kiểu trả về). Trong các trường hợp khác, bạn có thể muốn cố ý cung cấp hành vi khác nhau cho các chế độ xem riêng lẻ của một lớp thông qua các giao diện khác nhau.
Nguồn
2009-07-03 05:01:17
Đây không phải là lý do rất mạnh vì bạn vẫn phải chỉ định công khai theo cách thủ công cho tất cả các thành viên được triển khai ngầm. Nếu đó là trường hợp, trình biên dịch có thể tự động giả định những người như công chúng quá. –
Điều này là sai, vì bạn có thể có giao diện nội bộ. –