【问题标题】:Create Dervice Instance by passing base instance通过传递基本实例来创建设备实例
【发布时间】:2016-01-13 13:15:08
【问题描述】:

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

父类。

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 多个属性的类,我们就不能这样做。它有些丑陋。 那么有没有办法创建传递父实例的子实例而不是一一设置属性值。

【问题讨论】:

    标签: java inheritance polymorphism


    【解决方案1】:

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

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

    或者你需要让一个孩子有一个 Parent 作为一个字段,比如:

    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;
        }
        ...
    }
    

    【讨论】:

    • 感谢您的回复。但对不起。这不是我所期望的。我想使用父实例创建子实例,但不能一一设置属性值。我的意思是我需要一些东西,比如通过克隆父实例来创建子实例。
    • 好的,你为什么不简单地创建一个Parent的构造函数,它将获取一个Parent实例并设置所需的字段。这将导致您在添加一些新字段后修改此构造函数。无论如何,如果您想针对原生 OOP 原则使用 3rdparty 库,则必须考虑您的设计。
    • 我得到的这个非常简单的例子。假设我提到该类有 100 多个属性,我们必须一一设置。当我们有这样的对象时,我想要这个。
    • 只需在 Parent 构造函数中使用一些 3rd 方库,让他们初始化您的字段。喜欢commons.apache.org/proper/commons-beanutils 但你不会被它破坏 OOP 设计。它只是父构造函数的实现
    猜你喜欢
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 2013-03-20
    相关资源
    最近更新 更多