2017-03-02 19 views
5

Chúng tôi có một lớp cơ sở Một trong đó bao gồm 6 phương pháp công cộng:Làm thế nào để cung cấp quyền truy cập vào các phương thức lớp chọn lọc trong kế thừa?

public class A 
{ 
public void method1() 
{ 
    // Implementation 
} 

public void method2() 
{ 
    // Implementation 
} 
. 
. 
. 
. 
public void method6() 
{ 
    // Implementation 
} 
} 

Chúng tôi có hai con lớp B và C mà kế thừa từ A. Làm thế nào tôi có thể thực hiện nó theo cách như vậy mà lớp B có quyền truy cập vào chỉ method1(), phương thức 2(), phương thức3() và lớp C mới có quyền truy cập vào phương thức4(), phương thức5(), phương thức6() ??

+5

Bạn không thể, về cơ bản. Chúng là phương thức công khai - * mọi thứ * có thể gọi chúng, bất kể thừa kế. Có vẻ như bạn có thể muốn hai lớp riêng biệt ở đây thực sự ... –

+3

thì bạn cần hai lớp. class 'A1' là cha của' B' và 'A2' là cha của' C' và cả hai 'A1' và' A2' lớp kế thừa 'A' hoặc giao diện thực hiện' IA' –

+0

Thành phần là con đường để đi, tôi nghĩ rằng – HopefullyHelpful

Trả lời

9

Về cơ bản, bạn không thể làm điều đó. Thực tế là bạn đang cố gắng làm điều đó sẽ là một cảnh báo rằng có điều gì đó sai với mã của bạn.

15

Bạn không thể ngăn chặn điều gì đó sử dụng các phương thức public class A, nhưng bạn chắc chắn có thể ẩn chúng bằng cách sử dụng giao diện thích hợp.

interface IAOne 
{ 
    void method1(); 
    void method2(); 
    void method3(); 
} 

interface IATwo 
{ 
    void method4(); 
    void method5(); 
    void method6(); 
} 

class A : IAOne, IATwo 
{ 
    void method1() { } 
    void method2() { } 
    void method3() { } 
    void method4() { } 
    void method5() { } 
    void method6() { } 
} 

Vì vậy, bây giờ bạn có lớp B mà không bao giờ cần phải biết về A tương đương khoảng A 's phương pháp. Nó chỉ biết về giao diện IAOne. B bây giờ có thể tái phơi bày bất kỳ phương thức nào (và thậm chí tái triển khai giao diện) và ủy quyền thực hiện các phương thức đó cho A.

class B : IAOne 
{ 
    private IAOne _a; 
    public B(IAOne a) { _a = a; } 

    void method1() { _a.method1(); } 
    void method2() { _a.method2(); } 
    void method3() { _a.method3(); } 
} 
+0

Nhưng trong trường hợp này, tôi sẽ không sử dụng lớp A phải không? Vì vậy mà does'nt giải quyết mục đích !!! –

+0

@SriramM Dựa trên câu hỏi của bạn. Nếu có một lý do thì điều này không có tác dụng, thì câu hỏi của bạn là xấu, và không đưa ra các yêu cầu. – Andrew

+1

Đây là giải pháp đúng: sử dụng giao diện và sáng tác một cách khôn ngoan thay vì thừa kế. –

0

tôi làm không phải bây giờ tại sao bạn phải nhấn mạnh sử dụng một lớp (A) với tất cả 6 phương pháp, nhưng nếu bạn muốn nhận được rằng có thể bạn nên thiết kế lập trình khía cạnh và đưa và đánh chặn trên đầu phương pháp của bạn . Sau đó, bạn có thể kiểm tra người gọi bằng MethodCallerInfo và kiểm soát từng lớp con của bạn chỉ cần gọi phương thức của riêng họ

Các vấn đề liên quan