2017-03-02 7 views
5

我々は6つのパブリックメソッドで構成され、基本クラスを持っている:継承の選択クラスメソッドにアクセスする方法は?

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

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

私たちは、私はクラスBへのアクセス権を持っているような方法でそれを実装するにはどうすればよいA.から継承2件のクラスBとCを持っていますmethod1()、method2()、method3()、およびクラスCのみがmethod4()、method5()、method6()にアクセスできます。

+5

基本的にはできません。それらはパブリックメソッドです* *何かは、継承にかかわらず、それらを呼び出すことができます。 2つの別々のクラスが本当にここにあるように聞こえるかもしれませんね... –

+3

あなたは2つのクラスが必要です。 'A1'は' B'の親で、 'A2'は' C'の親であり、 'A1'と' A2'はクラス 'A'を継承するか、あるいはインターフェースIAを実装します –

+0

構想は私が考える方法です – HopefullyHelpful

答えて

9

あなたは基本的にそれを行うことはできません。あなたがそれをしようとしているという事実は、あなたのコードに何か問題があるという警告として役立つはずです。

15

パブリッククラスAメソッドの使用を防ぐことはできませんが、インターフェイスを適切に使用することで間違いなく非表示にすることができます。

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() { } 
} 

は、だから今は、およそAまたは約Aの方法を知っている必要がありませんクラスBを持っています。それはIAOneインターフェイスについてのみ知っています。 Bは今でも任意のメソッドを再公開することができ(そしてさらにインターフェイスを再実装することもできます)、それらの実装を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

しかし、この場合、クラスAの権利は使用されませんか?だからそれは目的を解決しません! –

+0

@SriramMそれはあなたの質問にあるものに基づいています。理由があると、これがうまくいかず、あなたの質問は悪く、要件を適切にレイアウトしていませんでした。 – Andrew

+1

これは適切な解決策です:継承の代わりにインタフェースと構成を賢明に使用すること。 –

0

あなたはすべての6つの方法で一つのクラス(A)を使用するように強調する必要があり、なぜ私は今はありませんが、あなたはそれがあなたの方法の頭の上にアスペクトプログラミングの設計とを入れて、迎撃すべきであることが取得したい場合。次に、MethodCallerInfoで呼び出し元をチェックし、それぞれの子クラスにコントロールすることで、独自のメソッドを呼び出すことができます。

関連する問題