2017-03-29 43 views
1

我有以下类别:如何重构两种方法,这是非常相似的

public interface IBaseInterface { 
    String baseMethod(); 
} 

public class BaseClass implements IBaseInterface{ 

    @Override 
    public String baseMethod() { 
     return "baseInterface"; 
    } 

    public String otherBaseMethod(){ 
     return "otherBaseMethod"; 
    } 

} 

public class ClassA implements IBaseInterface{ 

    @Override 
    public String baseMethod() { 
     return "ClassA"; 
    } 

    public String getAttribiuteA(){ 
     return "A"; 
    } 

} 

public class ClassB implements IBaseInterface { 

    @Override 
    public String baseMethod() { 
     return "ClassB"; 
    } 

    public String getAttribiuteB(){ 
     return "B"; 
    } 

} 

而且现在我有两个非常相似的方法:

private String getBaseMethod(){ 

    /** Do something */ 

    if(/** */){ 
     BaseClass base = new BaseClass(); 
     return base.baseMethod(); 
    }else if (/** */){ 
     ClassA a = new ClassA(); 
     return a.baseMethod(); 
    } else { 
     ClassB b = new ClassB(); 
     return b.baseMethod(); 
    } 
} 

private String getOtherMethod(){ 

    /** Do something */ 

    if(/** */){ 
     BaseClass base = new BaseClass(); 
     if(/** */){ 
      return base.baseMethod(); 
     } else{ 
      return base.otherBaseMethod() 
     } 
    } else if(/** */){ 
     ClassA a = new ClassA(); 
     return a.getAttribiuteA() 
    } else{ 
     ClassB b = new ClassB(); 
     return b.getAttribiuteB(); 
    } 
} 

这两种方法都非常相似。在if-Clause中是相同的条件。我们可以使这两种方法更好吗?更“抽象”?

我无法对我的类进行任何更改,只能在方法中进行更改。

+0

无论如何你对两种方法的目的是什么?你为什么要把它们放在第一位? – johnII

回答

0

我认为什么被要求在这里是用“多态”

因为所有这三个班,BaseClass的,ClassA的,和ClassB,都实现interfcae IBaseInterface,所以你可以做这样的事情就像下面的例子:

IBaseInterface i1 = new BaseClass(); 
IBaseInterface i2 = new ClassA(); 
IbaseInterface i3 = new ClassB(); 

正如你已经注意到的那样,你可以使用List来保存你的类。

List<IBaseInterface> interfaces = new ArrayList<>(); 
interfaces.add(i1); 
.... 

因为IBaseInterface有方法baseMethod(),现在你可以简单地遍历列表并调用baseMethod()方法为每个IBaseInterface对象。

寻找'多态行为'

+0

好吧,但如何调用方法getAttribiuteA()和getAttribiuteB()?这些方法只适用于ClassA和ClassB,所以polymorpgic不起作用... – Cwaniak

+0

如果您需要调用这些方法,则需要进行转换。没有更简单的方法来做到这一点。例如,您可以使用'实例'来检查对象是否是哪个类。 (Class2的实例)将返回true,因为i2是ClassA的实例(或对象)。然后,您可以通过((ClassA)i2).getAttributeA()调用getAttributeA()。您将i2转换为ClassA并调用其方法'getAttributeA()。'使用'instanceof'作为IBaseInterface变量中的对象可以是任何实现IBaseInterface接口的类是非常重要的。 – wysohn