用不同的实现调用相同的方法签名

时间:2014-10-28 18:27:50

标签: java oop object design-patterns

给定: 我有两个不同的项目遗产A和nextGen B. 第三个项目C在A和B之间共享。

目标: 我必须在第三个项目C中执行averageCalculation()。但是项目A和B的实现是不同的。使用相同的方法签名但不同的实现,如何创建设计?注意:项目A和B应该只调用averageCalulation()相同的方法签名。

项目C

Interface I {
averageCalculation();
}

Class CClass implements I{
?<averageCalculation()-for A>
?<averageCalculation()- for B>
}

项目A

{
I i1 = new CClass();
i1.averageCalculation();
}

项目B

{
I i2 = new CClass();
i2.averageCalculation();
}

上述方法是否正确?如果是这样,我将如何在CClass中创建averageCalculation()的两个实现?

3 个答案:

答案 0 :(得分:2)

创建两个实现接口的不同类,并在每个项目中使用不同的类:

项目C

interface I {
averageCalculation();
}

class CClassForA implements I{
    averageCalculation(){...} // for A
}

class CClassForB implements I{
    averageCalculation(){...} // for B
}

项目A

{
I i1 = new CClassForA();
i1.averageCalculation();
}

项目B

{
I i2 = new CClassForB();
i2.averageCalculation();
}

答案 1 :(得分:0)

接口只是实现它定义的类的契约。如果一个类在一个接口中需要两个不同的单个方法实现,那么你应该考虑重新设计你的项目

你为什么需要CClass?您可以在Project A中使用类I,在Project B中使用另一个类来执行相同的操作。

编辑:编译器不会让您拥有具有相同签名的方法的两种不同实现。如果你想要的话,你可以选择重载它

public interface SomeInter 
{
   public void doSomething();
}


public class ImplClass implements SomeInter
{

    @Override
    public void doSomething() {
        // TODO Auto-generated method stub

    }


    public void doSomething(String abc) 
    {
        // TODO Auto-generated method stub

    }

}

希望这会有所帮助!!

答案 2 :(得分:0)

我不确定我完全理解你的问题,但这是一个解决方案。您无法更改旧项目,但是您希望A和B符合某些接口I.您可以通过将A和B包装在符合I的内容中并使用A和B实现I来实现此目的。各自的实施。

public class Problem {

    public static class A{
        public int foo(){
            return 3;
        }
    }

    public static class B{
        public int foo(){
            return 5;
        }
    }

    public interface TheFoo{
        public int foo();
    }

    public static class AWrapper extends A implements TheFoo{
        public int foo(){
            return super.foo();
        }
    }

    public static class BWrapper extends B implements TheFoo{
        public int foo(){
            return super.foo();
        }
    }

    public static void main(String[] args){

        //TheFoo[] myFoos = new TheFoo[]{new A(), new B()}; Won't work
        TheFoo[] myFoos = new TheFoo[]{new AWrapper(), new BWrapper()};
        for(TheFoo curFoo : myFoos){
            System.out.println(curFoo.foo());
        }
    }   
}