Dưới đây là một ví dụ về tại sao nó không có ý nghĩa để có thể ghi đè lên visibility:
interface someI
{
void doYourWork();
}
public class A : someI
{
public void doYourWork()
{
//...
}
}
public class B : someI
{
private void doYourWork()
{
//...
}
}
void Main()
{
List<someI> workers = getWorkers();
foreach(var worker in workers)
worker.doYourWork();
}
gì xảy ra khi nhân viên của bạn là loại B? Bạn đang gọi một phương thức như thể nó là công khai, nhưng đó là một phương pháp riêng tư. Nếu bạn muốn chức năng này, thì nó không thực sự là một phương pháp riêng tư phải không?
Nếu bạn chỉ muốn nó được công khai khi tham chiếu thông qua giao diện của bạn, sau đó bạn có thể định nghĩa nó như vậy:
public class B : someI
{
void someI.doYourWork()
{
//...
}
}
Và bạn kết thúc với điều này:
var b = new B();
b.doYourWork(); // Not accessible
((someI)b).doYourWork(); // Accessible
Tôi sẽ đề nghị rằng đối với các lớp chưa được niêm yết, các giao diện có triển khai sẽ không hiển thị các thành viên lớp công khai có cùng tên và chữ ký cần được triển khai bằng các thành viên ảo được bảo vệ; Thật không may, một trong những gần nhất có thể đến để làm điều đó trong C# là có một giao diện thực hiện đơn giản chỉ cần gọi một phương pháp ảo được bảo vệ. Nếu không, nếu một lớp dẫn xuất thực hiện lại một giao diện sẽ không có cách nào để gọi thực hiện cha mẹ. – supercat
@supercat Có lẽ chỉ là sớm, nhưng tôi không chắc là tôi đang theo dõi bạn; những gì bạn có nghĩa là bởi 'Nếu không, nếu một lớp dẫn xuất lại thực hiện một giao diện sẽ không có cách nào để gọi thực hiện phụ huynh'? Tại sao bạn muốn có một phương thức được bảo vệ thực hiện một giao diện (bạn sẽ không thể truy cập nó thông qua giao diện trong trường hợp này; chỉ trong các lớp dẫn xuất có thể thậm chí không biết giao diện nào chúng đang thực hiện) – Rob
Trong vb.net , người ta có thể nói: 'Protected Overridable Sub DoSomethingImpl() Thực hiện IDoSomething.DoSomething'; mã bên ngoài sẽ chỉ có thể gọi phương thức đó thông qua giao diện, nhưng một lớp dẫn xuất sẽ có thể ghi đè phương thức và, trong quá trình ghi đè, hãy gọi phương thức cha. Trong C#, nó sẽ hữu ích để có thể tương tự như vậy sử dụng một phương pháp được bảo vệ để thực hiện một giao diện, nhưng những người phụ trách spec không cho phép tùy chọn đó. Người gần nhất có thể đến sẽ thực hiện một cách rõ ràng giao diện với một phương thức gọi phương thức được bảo vệ 'DoSomethingImpl()'. Lưu ý rằng ... – supercat