覆盖方法与组成

时间:2013-11-20 11:53:58

标签: java composition

考虑以下情况。我希望实现methoddA() class A的不同行为,具体取决于来自class Dclass C的来电地点。如何实现这一点,方法覆盖在这里不起作用。

class A
{
    public methodA(){ //some code }
}

class B
{
    A a = new A()
    public methodB()
    {
        a.methodA(); 
    }
}

class C
{
    B b = new B();

    public methodC()
    {
        b.methodB();
    }
}

class D
{
    B b = new B();

    public methodD()
    {
        b.methodB();
    }
}

3 个答案:

答案 0 :(得分:0)

这里需要的是多态性。首先创建一个接口 -

public interface MyInterface
{
    void methodA();
}

然后为两种不同的行为创建两种不同的实现 -

public class First implements MyInterface
{
    public void methodA() {
        // first behavior
    }
}

public class Second implements MyInterface
{
    public void methodA() {
        // second behavior
    }
}

现在按以下方式创建其他类 -

class B
{
    public void methodB(MyInterface m)
    {
        m.methodA(); 
    }
}

class C
{
    B b = new B();

    public void methodC()
    {
        // Pass the corresponding behavior implementation
        // as argument here.
        b.methodB(new First());
    }
}

class D
{
    B b = new B();

    public void methodD()
    {
        // Pass the second behavior implementation.
        b.methodB(new Second());
    }
}

这将产生更易于维护的代码。

答案 1 :(得分:0)

您可以将类名称作为String传递给方法,并在方法检查中

if(className.equals("A") // or use isInstanceOf() if you are passing objects of A/B
//do something

if(className.equals("B")
// do something else.

为什么需要两种不同的实现? 这个简单的技巧对你有用......如果我错了,请纠正我。

答案 2 :(得分:0)

我在下面的代码中修改了A1类和B1类的方法签名以接受Object,同样在调用C类和D类的方法时,我们调用B1类的方法将其作为参考传递。在A1类中,我们可以检查instanceof对象并识别调用类。

class A1
{
    public void methodA(Object c){ //some code }
        if (D.class.isInstance(c)){
            System.out.println("Called from Class D");
        }else if (C.class.isInstance(c)){
            System.out.println("Called from Class c");
        }else{
            System.out.println("Called from Some diff class");
        }
    }

}

class B1
{
    A1 a = new A1();
    public void methodB(Object c)
    {
        a.methodA(c); 
    }
}

class C
{
    B1 b = new B1();

    public void methodC()
    {
        b.methodB(this);
    }
}

class D
{
    B1 b = new B1();

    public void methodD()
    {
        b.methodB(this);
    }
}


public class Testnew{
    public static void main(String args[]){
        D d = new D();
        d.methodD();

        C c = new C();
        c.methodC();

        B1 b = new B1();
        b.methodB(b);
    }
}