Java 更改继承的超级方法
我想更改继承类的超级方法。我有这样的想法:Java 更改继承的超级方法,java,oop,inheritance,Java,Oop,Inheritance,我想更改继承类的超级方法。我有这样的想法: class A { public void method() { // Do something here ... } } class B extends A { @Override public void method() { // Do something here ... super.method(); } } cla
class A {
public void method() {
// Do something here
...
}
}
class B extends A {
@Override
public void method() {
// Do something here
...
super.method();
}
}
class C extends B {
@Override
public void method() {
if(useB()) {
// Use B's method
super.method();
} else {
// Use A's method
super.super.method();
}
}
}
如你所见,有时我需要使用A的方法,有时使用B的方法。那么,我应该怎么做呢?在
B.java
class A {
public void method() {
// Do something here
...
}
}
class B extends A {
public void preserveMethodA(){
super.method();
}
@Override
public void method() {
// Do something here
...
preserveMethodA()
}
}
class C extends B {
@Override
public void method() {
if(useB()) {
// Use B's method
super.method();
} else {
// Use A's method
super.preserveMethodA()
}
}
}
在
B.java
class A {
public void method() {
// Do something here
...
}
}
class B extends A {
public void preserveMethodA(){
super.method();
}
@Override
public void method() {
// Do something here
...
preserveMethodA()
}
}
class C extends B {
@Override
public void method() {
if(useB()) {
// Use B's method
super.method();
} else {
// Use A's method
super.preserveMethodA()
}
}
}
这是不对的,但你可以随时添加标志。如果标志为true,则调用B方法,如果为false,则调用方法
class A {
public void method(boolean flag) {
// Do something here, ignore flag
}
}
class B extends A {
@Override
public void method(boolean flag) {
if (flag) {
//do something
} else {
super.method();
}
}
}
class C extends B {
@Override
public void method(boolean flag) {
super.method(useB());
}
}
这是不对的,但你可以随时添加标志。如果标志为true,则调用B方法,如果为false,则调用方法
class A {
public void method(boolean flag) {
// Do something here, ignore flag
}
}
class B extends A {
@Override
public void method(boolean flag) {
if (flag) {
//do something
} else {
super.method();
}
}
}
class C extends B {
@Override
public void method(boolean flag) {
super.method(useB());
}
}
根据
useB()
的结果,将条件if(useB())
移到C.method()
之外,并将C
的实例上抛到A
或B
中,然后对上抛的实例调用method()
。将条件if(useB())
移到C.method()之外
并将C
的实例向上转换为A
或B
,具体取决于useB()
的结果,并在向上转换的实例上调用method()。您应该考虑您的结构,并尝试在不使用a-->b-->c结构的情况下解决此问题。想想你的设计,以及为什么会发生这种情况。事实上,这个“问题”在这里被称为“代码气味”,这意味着一些事情可能是不可能的,我认为简单的答案是:你不应该。您应该考虑您的结构,并尝试在不使用a-->b-->c结构的情况下解决此问题。想想你的设计,以及为什么会发生这种情况。事实上,这个“问题”在这里被称为“代码气味”,这意味着某些东西可能出了问题