2017-03-29 58 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