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为两个类:在哪里应该 extends ,所以extendsBaseFoo和extends 。ExtendedFooExtendedFooBaseFooBar1BaseFooBar2ExtendedFoo
  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

可以通过将 Bar2 放在同一个包中,将 Bar1 放在不同的包中,并分别使方法受包保护和公开。或者您可以创建注释并生成代码以通过反射蛮力检查调用者。

于 2013-03-14T07:59:30.357 回答
0

你不能,你在超类中的所有公共抽象方法对子类都是可见的。不仅如此,所有子类都必须实现所有抽象方法。

根据您的需要,我建议在 Foo 和 Bar1 之间设置另一个类,您可以在其中实现所需的方法。

于 2013-03-14T08:00:06.890 回答
0

为了增加我自己的两分钱,我会说不是使用超类,而是创建两个接口。即Foo1Foo2。每个接口都将包含其中一种方法。然后你可以分别拥有Bar1Bar2实施Foo1Foo2。这种方法的好处是您可以拥有一个Bar3实现两个接口的类,而对于抽象类,您只能扩展一个超类。

于 2013-03-14T08:04:13.747 回答
0

如果 Foo 类只有抽象方法,您可以将 Foo 类分成 2 个接口,然后在 bar1 和 bar2 中实现所需的接口。或者,将仅在 bar1 中需要的方法拆分为一个接口,并将其余方法留在 foo 中

于 2013-03-14T08:05:42.353 回答