jam*_*jam 21 java abstract modifiers
在抽象类中,哪个访问修饰符必须用于方法,因此子类可以决定它是否应该是公共的?是否可以"覆盖"Java中的修饰符?
public abstract class A {
??? void method();
}
public class B extends A {
@Override
public void method(){
// TODO
}
}
public class C extends B {
@Override
private void method(){
// TODO
}
}
Run Code Online (Sandbox Code Playgroud)
我知道静态绑定会有问题,如果有人打电话:
// Will work
A foo = new B()
foo.method();
// Compiler ?
A foo = new C();
foo.method();
Run Code Online (Sandbox Code Playgroud)
但也许还有另一种方式.我怎么能做到这一点?
Jir*_*sek 12
可以放宽限制,但不要限制它:
public abstract class A {
protected void method();
}
public class B extends A {
@Override
public void method(){ // OK
}
}
public class C extends A {
@Override
private void method(){ // not allowed
}
}
Run Code Online (Sandbox Code Playgroud)
使原始方法private也不起作用,因为这种方法在子类中不可见,因此无法覆盖.
我建议使用interfaces来有选择地公开或隐藏方法:
public interface WithMethod {
// other methods
void method();
}
public interface WithoutMethod {
// other methods
// no 'method()'
}
public abstract class A {
protected void method();
}
public class B extends A implements WithMethod {
@Override
public void method(){
//TODO
}
}
public class C extends B implements WithoutMethod {
// no 'method()'
}
Run Code Online (Sandbox Code Playgroud)
...然后只通过接口处理实例.
覆盖方法时,只能将修改器更改为更宽的方法,反之亦然.例如,此代码有效:
public abstract class A {
protected void method();
}
public class B extends A {
@Override
public void method() { }
}
Run Code Online (Sandbox Code Playgroud)
但是,如果您尝试缩小可见性范围,则会出现编译时错误:
public abstract class A {
protected void method();
}
public class B extends A {
@Override
private void method() {}
}
Run Code Online (Sandbox Code Playgroud)
对于你的情况,我建议C不要实现A,因为A抽象暗示有非私有method():
public class C {
private void method(){
//TODO
}
}
Run Code Online (Sandbox Code Playgroud)
另一种选择是method()在C抛出RuntimeException时实现:
public class C extends A {
@Override
public void method(){
throw new UnsupportedOperationException("C doesn't support callbacks to method()");
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4417 次 |
| 最近记录: |