派生类的抽象方法限制控制

时间:2013-03-14 07:56:10

标签: java class abstract

抽象基类是否可以使用抽象方法,其中只有某些派生类可以访问某些抽象方法?我想要做的是限制可以从不同的继承类调用的可能方法。以下是我的问题示例:

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));
     }

6 个答案:

答案 0 :(得分:3)

必须在每个子类中覆盖所有公共抽象方法。 你能做什么:

  1. Foo抽象类拆分为两个类:BaseFooExtendedFoo其中ExtendedFoo应扩展BaseFoo,因此Bar1扩展{{1} }和BaseFoo扩展Bar2
  2. 覆盖不需要的方法以抛出ExtendedFoo,因此如果调用此方法,则会抛出(有意义的)异常。
  3. 我会采用第一种方法。

答案 1 :(得分: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));
     }
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您不能,超类中的所有公共抽象方法对子类都是可见的。 除此之外,所有子类都必须实现所有抽象方法。

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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