通过传递基础实例来创建Dervice Instance

时间:2015-10-15 07:29:53

标签: java inheritance polymorphism

嗨这个非常基本的问题。但我需要知道处理这个问题的最佳方法是什么。

家长班。

public class Parent {

    private String familyName;

    public Parent() {
    }

    public Parent(String familyName) {
        this.familyName = familyName;
    }

    public String getFamilyName() {
        return familyName;
    }

    public void setFamilyName(String familyName) {
        this.familyName = familyName;
    }

儿童班。

   public class Child extends Parent {

    String name;

    public Child(Parent parent) {
       super(parent.getFamilyName());
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Child{" +
                "name='" + name + '\'' +
                "familyname='" + getFamilyName() + '\'' +
                '}';
    }
}

或者是否有任何支持库通过克隆父实例来创建子实例。

这是我们通常可以做的事情。但是当我们的属性很少时,这是可以的。 但如果我们有一个100多个属性的类,我们就无法做到这一点。它有些丑陋。 那么有没有办法创建子实例传递父实例,​​而不是逐个设置属性值。

1 个答案:

答案 0 :(得分:0)

在我看来有点令人困惑,你必须传递一个Parent类作为Child的参数,并且你可以拥有一个类,在构造函数中需要这么多的输入参数。此外,您必须尝试传递字段值,以隐藏类的inhritance,而不是Parent类。像:

public class Child extends Parent {

    String name;

    public Child(String name, String familyName) {
       super(familyName);
       this.name = name;
    }
    ...
}

或者您需要让孩子将父母作为字段,例如:

public class Child  {

    String name;
    Parent parent;

    public Child(String name, Parent parent) {
       this.parent = parent;
       this.name = name;
    }
    ...
}

您可以为Parent和Child提供一些通用界面,并将其用于您的目的。或者甚至更多,您可以将其扩展为Parent类,但将其作为实例并覆盖您需要的所有方法,例如:

public class Child extends Parent {

    String name;
    Parent parent;

    public Child(String name, Parent parent) {
       super();
       this.parent = parent;
       this.name = name;
    }

    @Override
    public String getFamilyName() {
       return parent.familyName;
    }

    @Override
    public void setFamilyName(String familyName) {
        parent.familyName = familyName;
    }
    ...
}

但是,IMO,你需要有一个非常有价值的理由来使用这样的解决方案,因为它并不像通常那样简单。

另一个解决方案是创建一个额外的Parent构造函数,如:

public class Parent {

    private String familyName;

    public Parent() {
    }

    public Parent(Parent clone) {
        this.familyName = clone.familyName;
    }

    ...
}

并将其命名为:

public class Child extends Parent {

    String name;

    public Child(String name, Parent parent) {
       super(parent);
       this.name = name;
    }
    ...
}