繁体   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