2015-10-15 72 views
2

嗨这是非常基本的级别问题。但我需要知道什么是处理这个问题的最佳方法。通过传递基础实例创建服务实例

父类。

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 +属性的类,我们不能这样做。它的一些东西很难看。 那么有什么办法可以创建子实例传递父实例,​​而不是逐个设置属性值。

回答

0

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

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

您可以为父母与子女的一些常用的接口,并使用它为您的目的。甚至更多,你可以离开它扩展父类,但它作为实例,并覆盖所有你需要的方法,如:

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

但是,海事组织,你需要有一个真正有价值的理由来使用这样一个解决方案,因为它不像平常那​​样简单。

还有一个解决办法是让一个额外的父类的构造,如:

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

感谢答复。但很抱歉。这不是我的预期。我想使用父实例创建子实例,但不能逐个设置属性值。我的意思是我需要通过克隆父实例来创建子实例。 –

+0

好吧,为什么不简单地创建一个Parent的构造函数,它将获得一个Parent实例并设置所需的字段。这会让你修改这个构造函数,因此你添加了一些新的字段。无论如何,如果你想使用第三方库对原生OOP princips,你必须考虑你的设计。 – Stanislav

+0

这个我得到的非常简单的例子。假设我提到这个类有100多个属性,我们必须逐个设置。当我们有这样一个对象时,我想要这个。 –