Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更改继承的超级方法_Java_Oop_Inheritance - Fatal编程技术网

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结构的情况下解决此问题。想想你的设计,以及为什么会发生这种情况。事实上,这个“问题”在这里被称为“代码气味”,这意味着某些东西可能出了问题