Bản chất của vấn đề là, đưa ra một hệ thống phân cấp lớp như thế này:Làm thế nào để ẩn (loại bỏ) một phương thức của lớp cơ sở trong C#?
class A
{
protected void MethodToExpose()
{}
protected void MethodToHide(object param)
{}
}
class B : A
{
new private void MethodToHide(object param)
{}
protected void NewMethodInB()
{}
}
class C : B
{
public void DoSomething()
{
base.MethodToHide("the parameter"); // This still calls A.MethodToHide()
base.MethodToExpose(); // This calls A.MethodToExpose(), but that's ok
base.NewMethodInB();
}
}
Làm thế nào tôi có thể ngăn chặn bất kỳ lớp kế thừa từ lớp "B" từ nhìn thấy những phương pháp A.MethodToHide()
? Trong C++, điều này đã đủ dễ dàng bằng cách sử dụng một khai báo như class B : private A
, nhưng cú pháp này không hợp lệ trong C#.
Đối với những người quan tâm (hoặc tự hỏi tôi là gì thực sự cố gắng làm), những gì chúng tôi đang cố gắng làm là tạo trình bao bọc cho Rhino.Commons.NHRepository ẩn các phương pháp mà chúng tôi không muốn tiếp xúc với nhóm các nhà phát triển của chúng tôi, vì vậy chúng tôi có thể có một cách cắt cookie để phát triển ứng dụng của chúng tôi mà các nhà phát triển mới có thể dễ dàng theo dõi. Vì vậy, có, tôi tin rằng thử nghiệm "Is-A" là hợp lệ cho toàn bộ chuỗi (WidgetRepository Is-A BaseRepository Is-A NHRepository).
Chỉnh sửa: Tôi nên đề cập, vì lợi ích của đối số, lớp A là lớp API ngoài tầm kiểm soát của chúng tôi. Nếu không, vấn đề sẽ dễ dàng hơn nhiều.
+1: Tôi thích giải pháp này! Miễn là các nhà phát triển gắn bó với giao diện và không đưa nó một cách rõ ràng vào lớp tùy chỉnh, họ sẽ không có quyền truy cập vào bất kỳ thứ gì ngoài những gì được chỉ định trong giao diện. – Blixt
Đó là một ý tưởng khéo léo. Điều này là dọc theo dòng của những gì chúng tôi đã làm (sử dụng NHibernate, MVC, Dependency Injection, ...), vì vậy chúng tôi đã có giao diện cho các kho (lớp C). Điều đó giữ cho khách hàng của lớp C trong bóng tối về những gì dưới-the-cover. Tất cả những gì còn lại phải lo lắng là cách C được triển khai. Trong trường hợp của chúng ta, sẽ có nhiều lớp con "C" (kho lưu trữ cho các đối tượng khác nhau). Vì vậy, lý tưởng của chúng tôi có lẽ có B là một wrapper/adapter để A. Thật không may, A có rất nhiều phương pháp để quyết định nếu chúng ta muốn ẩn hoặc lộ trong B. –