2012-01-20 17 views
2

是否可以調用一個方法,一個抽象的構造,然後傳遞到一些其他的方法,這將每個鑄造新的對象到指定的子類?也就是說,運行抽象構造函數,然後澆注到子類

public AbstractClass createNewAbstractClass() { 
    //do lots of checks that are the same for each sub class, 
    //including geting and checking each variable, 
    //and an exception thrown by the constructor. 
    AbstractClass abstractClassObject = new AbstractClass(var1, ...); 
    return abstractClassObject; 
} 

public SubClassOne createSubClassOneObject() { 
    SubClassOne subClassOneObject = (SubClassOne)createNewAbstractClass(var1,..); 
    return subClassOneObject; 
} 

public SubClassTwo createSubClassTwoObject() { ... 

一種方法來避開這將是獲取並檢查所有變量的一種方法,那麼陣列中的回報他們,因此該方法createSubClassNObject()能在正確的構造函數中使用它們,但這似乎相當混亂,這意味着每個create方法必須檢查以同樣的方式相同的異常,做這件事了同樣的事情,這聽起來像完全情況下,你應該嘗試外包給另一種方法!

我是從實用的角度出發感興趣 - 我想我的代碼是整齊和可讀性 - 而且從理論角度 - 這是實際可能嗎?所以即使答案是否定的,你能解釋爲什麼嗎?

回答

4

有幾個問題是:

  • 抽象類不能被實例化;抽象類的構造函數只能在子類的構造函數中調用。
  • 即使父類不是抽象類型,(SubClassOne)類型轉換也會失敗,因爲我們確實有一個類型爲AbstractClass的實例,而不是SubClassOne類型的實例類型爲AbstractClass

所以不幸的是,它返回一個SubClassOne方法需要調用一個SubClassOne構造函數,它可能採取相同的參數AbstractClass,只是用super電話委託。

我不認爲有各地複製在每個工廠方法的一些異常處理代碼沒有簡單的方法;構造函數在多態性方面表現不佳。你可以有一箇中央構造函數返回AbstractClass,但它需要一個參數(枚舉,一個Class,等等)來告訴它調用的子類的構造。

abstract class Cow { 
    Cow() throws Exception { 
    ... // possible exceptions 
    } 
} 

class FatCow extends Cow { 
    FatCow() throws Exception { 
    super(); 
    ... 
    } 
} 

class GreenCow extends Cow { 
    GreenCow() throws Exception { 
    super(); 
    ... 
    } 
} 

enum CowType { 
    FAT_COW, GREEN_COW; 
} 

class CowMachine { 
    static Cow makeCow(CowType type) { 
    try { 
     switch (type) { 
     case FAT_COW: 
      return new FatCow(); 
     case GREEN_COW: 
      return new GreenCow(); 
     default: 
      throw new IllegalArgumentException(); 
     } 
    } catch (Exception e) { 
     ... 
     return null; 
    } 
    } 

    static Cow makeFatCow() { 
    return (FatCow) makeCow(CowType.FAT_COW); 
    } 

    static Cow makeGreenCow() { 
    return (GreenCow) makeCow(CowType.GREEN_COW); 
    } 
} 

如果你不想要一個大馬桶蓋語句,你可以改爲接受Class對象,並調用newInstance,雖然這將是慢。

+0

好的,謝謝。這讓我頭腦中的抽象課程變得清晰 - 我想我明白爲什麼我不能做我想問的問題。 – DenverCoder8