抽象基类是否有可能具有只有某些派生类才能访问某些抽象方法的抽象方法?我要做的是限制从不同继承类调用可能的方法。下面是我的问题的一个例子:
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));
}
所有的公共抽象方法必须在每个子类中被重写。你能做的:
- 将
Foo
抽象类拆分为BaseFoo
和ExtendedFoo
两个类,其中ExtendedFoo
扩展BaseFoo
,因此Bar1
扩展BaseFoo
,Bar2
扩展ExtendedFoo
。 - 重写不需要的方法来抛出
UnsupportedOperationException
,所以如果这个方法被调用,它将抛出(有意义的)异常。
我选择第一个方法
就像这样。然而,这可能不是你真正想要的。这取决于你的实际需求。
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));
}
}
不能,父类中的所有公共抽象方法对子类是可见的。不仅如此,所有子类都必须实现所有抽象方法。
对于您的需要,我建议在Foo和Bar1之间有另一个类,在那里您可以实现所需的方法。
可以通过将Bar2放在同一个包中而将Bar1放在不同的包中并分别将方法设置为包保护和公共来实现。或者您可以创建一个注释并生成代码,通过反射暴力检查调用者。
我想说的是,与其使用超类,不如创建两个接口。即Foo1
和Foo2
。每个接口将包含一个方法。然后可以让Bar1
和Bar2
分别实现Foo1
和Foo2
。这个方法的好处是你可以有一个类Bar3
实现两个接口,然而,对于抽象类,你只能扩展一个超类。
如果Foo类只有抽象方法,您可以将Foo类分离为两个接口,然后实现bar1和bar2中所需的任何接口。或者将bar1中只需要的方法拆分到一个接口中,其余的留在foo