抽象基类是否可以使用抽象方法,其中只有某些派生类可以访问某些抽象方法?我想要做的是限制可以从不同的继承类调用的可能方法。以下是我的问题示例:
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));
}
答案 0 :(得分:3)
必须在每个子类中覆盖所有公共抽象方法。 你能做什么:
Foo
抽象类拆分为两个类:BaseFoo
和ExtendedFoo
其中ExtendedFoo
应扩展BaseFoo
,因此Bar1
扩展{{1} }和BaseFoo
扩展Bar2
。ExtendedFoo
,因此如果调用此方法,则会抛出(有意义的)异常。我会采用第一种方法。
答案 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)
要添加我自己的两分钱,我会说不是使用超级类,而是创建两个接口。即Foo1
和Foo2
。每个接口都将包含其中一个方法。然后,您可以分别Bar1
和Bar2
实施Foo1
和Foo2
。这种方法的好处是你可以拥有一个实现两个接口的类Bar3
,而使用抽象类,你只能扩展一个超类。
答案 5 :(得分:0)
如果Foo类只有抽象方法,你可以在2个接口中分离Foo类,然后实现bar1和bar2中所需的任何接口。或者,将bar1中仅需要的方法拆分为接口,将其余部分保留在foo
中