簡體   English   中英

Java:返回一個擴展抽象類的對象,該抽象類接受參數

[英]Java: Return an object that extends an abstract class which takes arguments

我有一個界面

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

對於這個接口的方法的實現,我想返回一個擴展AbstractClass的通用對象,並給它兩個參數構造函數

澄清我想要實現的目標。 在實現I的類中:

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

構造函數不是繼承的,因此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();
    }
}

對於這個問題有很復雜的解決方案(粗略地說:與依賴注入相關的一切)。 但是,在這種情況下,沒有那么多選項:有人提供這些參數,而且它們顯然無法傳遞給接口方法。 所以你可能需要類似的東西

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM