Java:返回一个扩展抽象类的对象,该抽象类接受参数

时间:2014-02-06 00:08:34

标签: java inheritance abstract-class

我有一个界面

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)
}

2 个答案:

答案 0 :(得分: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 :(得分: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();