拥有两种不同行为的相同方法?

时间:2014-12-08 19:22:58

标签: java design-patterns

我的问题不是Java特定的,但我认为它更像是设计模式问题。 我试着用一个例子来解释:

我有两个班级(A和B),B正在扩展A. 这两个类看起来像这样:

public class A {

    protected int method1() {
        System.out.println(method3());
    }

    protected int method3() {
        return 3;
    }

}

public class B extends A {

    protected void method2() {
        //Calling method1
        method1(); // Output : 3

        //Calling method1 another time but method3 needs to be slightly different
        method1(); // Output needs to be : 6
    }
}

所以,我想调用两次相同的方法但是我想在第二次调用时修改method3()里面的内容。 显然,我不想定义两个不同的method1(),因为method1不仅打印出一个int,而且它正在做更多的事情。

第二种方法3可能如下所示:

protected int method3bis() {
    return 2*3;
}

我真的想避免在所有方法中传递某种论据,这看起来像这样:

protected int method1(int arg) {
    if(arg == 0)
        System.out.println(method3());

    if(arg == 1)
        System.out.println(method3bis());
}

你知道有什么好办法吗? 在此先感谢: - )

2 个答案:

答案 0 :(得分:0)

你可以通过创建一个新的A对象来实现这一点,但这不是一个很好的方法。你最好使用if / else块。

import java.lang.reflect.*;

public class B extends A {

        protected void method2() {

            try {
                Class a = Class.forName("A");
                Object aa = a.newInstance();
                ((A) aa).method1(); // Output : 3
            } catch (Exception e) {
                e.printStackTrace();
            }



            //Calling method1 another time but method3 needs to be slightly different
            this.method1(); // Output needs to be : 6
        }

        @Override
        protected int method3() {
            return 2*3;
        }

}

答案 1 :(得分:0)

在Java中无法在运行时更改方法的实现。

覆盖方法时,可以调用直接超类实现,例如:

class Super {
    void method1() {
        System.out.println(3);
    }
}

class Sub {
    @Override
    void method1() {
        System.out.println(2 * 3);
    }

    void method2() {
        // printing 3
        super.method1();

        // printing 6
        this.method1();
    }
}

但是,这不能以您所描述的方式使用(在更改 method3 的实现时调用 method1 )。而实施你所描述的内容也是一种非常混乱的方式。

您应该使用方法参数,因为这就是它们的用途。