3

抽象基底クラスが、特定の派生クラスだけが特定の抽象メソッドにアクセスできる抽象メソッドを持つことは可能ですか? 私がやろうとしているのは、継承されたさまざまなクラスから呼び出せるメソッドを制限することです。これが私の質問の例です:

public abstract Foo
{
    ...
    public abstract void fooMethod1(int num1);
    public abstract void fooMethod2(int num2);
}

public Bar1 extends Foo // This class shouldn't be able to access fooMethod2()
{
    ...
    @Override
    public void fooMethod1(int num1)
    {
        System.out.println((num1 * 5));
    }
}

public Bar2 extends Foo // This class has no restrictions
{
     ...
     @Override
     public void fooMethod1(int num1)
     {
          System.out.println((num1 * 10));
     }

     @Override
     public void fooMethod2(int num2)
     {
          System.out.println((num2 * 5));
     }
4

6 に答える 6

2

すべてのパブリック抽象メソッドは、すべてのサブクラスでオーバーライドする必要があります。何ができるか:

  1. Foo抽象クラスを2つのクラスに分割します:BaseFooそしてExtendedFooどこで拡張するExtendedFoo必要がBaseFooあるので、Bar1extendsBaseFooBar2extends ExtendedFoo
  2. 不要なメソッドをオーバーライドしてスローUnsupportedOperationExceptionし、このメソッドが呼び出された場合に(意味のある)例外がスローされるようにします。

私は最初のアプローチで行きます。

于 2013-03-14T08:01:07.477 に答える
2

こんな感じです。ただし、これは本当に必要なものではない場合があります。それはあなたの実際の要件に依存します。

public abstract class Foo
{

}

public abstract class FooMeth1 extends Foo {
    public abstract void fooMethod1(int num1);

}

public abstract class FooMeth2 extends FooMeth1 {
    public abstract void fooMethod2(int num2);
}

public class Bar1 extends FooMeth1 // This class shouldn't be able to access fooMethod2()
{
    @Override
    public void fooMethod1(int num1)
    {
        System.out.println((num1 * 5));
    }
}

public class Bar2 extends FooMeth2 // This class has no restrictions
{
     @Override
     public void fooMethod1(int num1)
     {
          System.out.println((num1 * 10));
     }

     @Override
     public void fooMethod2(int num2)
     {
          System.out.println((num2 * 5));
     }
}
于 2013-03-14T08:01:37.287 に答える
0

スーパークラスのすべてのパブリック抽象メソッドがサブクラスに表示されることはできません。これ以上に、すべてのサブクラスがすべての抽象メソッドを実装することが必須です。

必要に応じて、FooとBar1の間に別のクラスを作成して、目的のメソッドを実装することをお勧めします。

于 2013-03-14T08:00:06.890 に答える
0

私自身の2セントを追加するには、スーパークラスを使用する代わりに、2つのインターフェイスを作成します。すなわちFoo1Foo2。各インターフェイスには、いずれかのメソッドが含まれます。Bar1次に、とをそれぞれBar2実装できます。このメソッドの利点は、両方のインターフェースを実装するクラスを持つことができるのに対し、抽象クラスでは、1つのスーパークラスしか拡張できないことです。Foo1Foo2Bar3

于 2013-03-14T08:04:13.747 に答える
0

Fooクラスに抽象メソッドしかない場合は、Fooクラスを2つのインターフェイスに分けてから、bar1とbar2で必要なインターフェイスを実装できます。または、bar1でのみ必要なメソッドをインターフェースに分割し、残りをfooに残します

于 2013-03-14T08:05:42.353 に答える