2011-05-17 76 views
19

在Java中,我可以以某種方式強制擴展抽象類來實現其構造函數的類作爲參數?java強制擴展類

喜歡的東西

public abstract class Points { 

    //add some abstract method to force constructor to have object. 
} 

public class ExtendPoints extends Points { 

    /** 
    * I want the abstract class to force this implementation to have 
    * a constructor with an object in it? 
    * @param o 
    */ 
    public ExtendPoints(Object o){ 

    } 
} 

回答

26

您可以在抽象類中使用構造函數的參數(使其保護,如果你想DIS-允許匿名子類)。

public abstract class Points{ 
    protected Points(Something parameter){ 
     // do something with parameter 
    } 
} 

這樣做,您強制執行類具有顯式構造函數,因爲它必須使用一個參數調用超級構造函數。

但是,您不能強制重寫類具有帶參數的構造函數。它可以隨時假像這樣的參數:

public class ExtendPoints extends Points{ 
    public ExtendPoints(){ 
     super(something); 
    } 
} 
2

沒有構造函數不能被繼承,因此每個班需要提供自己的,除非你不指定一個構造函數和得到默認的無參數的構造函數。

0

如果您向點添加public Points(Object o) {}構造函數,則強制任何子類構造函數調用該超級構造函數。但是我不認爲沒有辦法確保子類使用確切的構造函數簽名。

5

正如別人之前所說的,構造函數的簽名被強制執行,但是您可以通過使用AbstractFactory模式來強制執行一組特定的參數。然後,您可以定義您的工廠界面的創建方法以擁有特定的簽名。

-1

編輯

那麼,不,它不可能強制執行帶參數的構造函數。

2

也許有它不可能在編譯的時候,但你可以使用反射來檢查在運行時,如果所需的構造被宣佈:

public abstract class Points { 

    protected Points() { 
     try { 

      Constructor<? extends Points> constructor = 
       getClass().getDeclaredConstructor(Object.class); 
      if (!Modifier.isPublic(constructor.getModifiers())) 
       throw new NoSuchMethodError("constructor not public"); 

     } catch (SecurityException ex) { 
      throw new RuntimeException(ex); 
     } catch (NoSuchMethodException ex) { 
      throw (NoSuchMethodError) new NoSuchMethodError().initCause(ex); 
     } 
    } 
}