如何从父类返回类型为 Impl 类的对象



我想为所有实现类提供一个默认方法,该方法使用默认值初始化父字段。所以我不必在每个 Impl 类中重新定义这些初始化:

public abstract class Parent {
    private String name;
    public static Parent defaultParent() {
        Parent parent = new Parent();
        //fill default field values
        parent.name = "default name";
        return parent;
    }
}
public class Child extends Parent {
}

现在我可以打电话给Child.defaultParent().但这会给我一个类型 Parent 的对象。是否有可能以这种方式使对象成为隐式Child对象?以便 defaultParent 方法始终返回实现类的类型?

也许使用 java 8、函数接口或类似内容?

以下是使用 Java 8 的一种方法:

public abstract class Parent {
    private String name;
    public static <T extends Parent> T defaultParent(Supplier<T> constructor) {
        T parent = constructor.get();
        //fill default field values
        parent.name = "default name";
        return parent;
    }
}
public class Child extends Parent {
}

您可以像这样调用静态方法:

Child c = Parent.defaultParent(Child::new);

或者,您可以只使用构造函数重载而不是静态工厂方法:

public abstract class Parent {
    private String name;
    public Parent(boolean useDefaults) {
        if (useDefaults) {
            //fill default field values
            this.name = "default name";
        }
    }
}
public class Child extends Parent {
    public Child(boolean useDefaults) {
        super(useDefaults);
    }
    public Child() {
        super(false);
    }
}

这就是构造函数的目的。

abstract class Parent {
    private String name;
    protected Parent(String name) {
        this.name = name;
    }
    protected Parent() {
        this("default name");
    }
}
class DefaultChild extends Parent {
   public DefaultChild() { super(); }
}
class CustomChild extends Parent {
   public CustomChild(String value) { super(value); }
}

其他一切都只是一个花哨的 init 方法,不如构造函数,因为例如,您可以不再为final字段分配值。

abstract class Parent {
    private String name;
    protected void init() {
        this.name= "default name";
    }
    // or
    protected static void init(Parent parent) {
        parent.name = "default name";
    }
}

最新更新