编程语言
首页 > 编程语言> > java复制构造函数和继承

java复制构造函数和继承

作者:互联网

经过一番搜索,我没有找到有关复制构造函数和继承的任何好答案.
我有两个班:用户和学员.受训者从User继承,并且两个String参数被添加到受训者.
现在,我设法制作了User的副本构造函数,但对Trainee的副本构造函数不满意.
用户复制构造函数的代码如下:

public User (User clone) {
    this(clone.getId(), 
         clone.getCivilite(),
         clone.getNom(), 
         clone.getPrenom(), 
         clone.getEmail(), 
         clone.getLogin(), 
         clone.getTel(), 
         clone.getPortable(), 
         clone.getInscription(), 
         clone.getPw()
    );
}

我尝试在我的Trainee复制构造函数中使用super:

public Trainee (Trainee clone) {
    super (clone);
    this (clone.getOsia(), clone.getDateNaiss());
}

但这没有用,我被迫编写完整版本的复制构造函数的代码:

public Trainee (Trainee clone) {
    this(clone.getId(), 
         clone.getCivilite(),
         clone.getNom(),
         clone.getPrenom(), 
         clone.getEmail(), 
         clone.getLogin(), 
         clone.getTel(), 
         clone.getPortable(), 
         clone.getInscription(), 
         clone.getPw(), 
         clone.getOsia(), 
         clone.getDateNaiss()
    );
}

由于主体结构的原因,我必须像这样强制转换新实例:

  User train = new Trainee();
  User train2 = new Trainee((Trainee) train);

所以我的问题是:是否有更清洁的方法来做到这一点?我不能使用超级吗?

预先感谢您的答复和协助.

解决方法:

最好让Trainee的“完整”副本构造函数也使用一个User:

public Trainee(Trainee clone)
{
    this(clone, clone.getOsai(), clone.getDateNaiss());
}

public Trainee(User clone, String osai, String dateNaiss)
{
    super(clone);
    this.osai = osai;
    this.dateNaiss;
}

尽可能保持在每个类中都有一个“主”构造函数的模式是值得的,所有其他构造函数都直接或间接链接到该模式.

现在,不清楚在不指定现有用户信息的情况下创建受训者是否有意义……或者可能以其他方式指定它.可能是在这种情况下,您确实确实确实需要两组独立的构造函数-一组用于复制构造函数,而另一组用于“只给我所有值”.这实际上取决于您的上下文-我们不能仅凭此判断.

在这种情况下,您可能会稍微违反“一个主构造函数”规则,但是您可以想到存在两个主构造函数,每个构造函数分别用于不同目的.从根本上讲,您遇到了“继承变得混乱”的情况-这太常见了:(

标签:java,inheritance,copy-constructor
来源: https://codeday.me/bug/20191010/1888275.html