2014-02-06 31 views
0

我有一個接口的Java:返回繼承抽象類,它帶有參數

public interface I 
{ 
public AnAbstractClass k(); //Abstract Class constructor takes two arguments 
} 

此接口的方法的實現我想返回擴展了抽象類,也給通用對象的對象它的兩個參數構造函數

澄清我想實現的目標。在它實現我的類:

public AnAbstractClass k() 
{ 
    //return a new implementing AbstractClass object AbstractClassObject(arg1,arg2) 
} 
+0

你是什麼意思「給它的兩個參數的構造函數」嗎? –

+0

你的問題很不清楚。你問如何調用構造函數? – SLaks

+0

對不起。我的意思是覆蓋接口方法的方法將向返回的AnAbstractClass對象提供其構造函數所需的參數。 (根據定義AnAbstractClass有一個帶兩個參數的構造函數) – user3236409

回答

1

構造函數不能被繼承,所以AnAbstractClass子類不一定有兩個參數的構造。如果子類確實有兩個參數的構造,沒有什麼利用這兩個參數的構造函數創建一個子類的實例並返回它阻止你:

public abstract class AnAbstractClass 
{ 
    public AnAbstractClass(String foo, String bar) { 
     System.out.format("created with (%s, %s)\n", foo, bar); 
    } 
} 

public class BaseClass extends AnAbstractClass 
{ 
    public BaseClass(String foo, String bar) { 
     super(foo, bar); 
    } 
} 

public interface I 
{ 
    public AnAbstractClass k(); 
} 

public class Implementation implements I 
{ 
    @Override public AnAbstractClass k() { 
     return new BaseClass("hello", "world"); 
    } 
} 

public class Demo 
{ 
    public static void main(String[] args) { 
     I i = new Implementation(); 
     AnAbstractClass a = i.k(); 
    } 
} 
1

有此問題的先進的解決方案(粗略地說:與依賴注入相關的一切)。然而,在這種情況下,沒有太多選擇:有人必須提供這些參數,而且他們顯然不能傳遞給接口方法。所以,你可能會需要像

class Creator implements I 
{ 
    private Object arg0; 
    private Object arg1; 
    void setArgs(Object arg0, Object arg1) 
    { 
     this.arg0 = arg0; 
     this.arg1 = arg1; 
    } 

    @Override 
    public AnAbstractClass k() 
    { 
     return new ConcreteClassExtendingAnAbstractClass(arg0, arg1); 
    } 

} 

的缺點是,這個接口有可能成爲或多或少沒用:如果它被設計成一個工廠,你不能再在它的抽象形式使用它...

I i = obtainFromSomewhere(); 
AnAbstractClass a = i.k(); 

但你總是必須知道特定類型

Creator i = obtainFromSomewhere(); 
i.setArgs(..., ...); 
AnAbstractClass a = i.k();