7

经过一番搜索,我没有找到关于复制构造函数和继承的问题的任何好的答案。我有两个班级:用户和实习生。Trainee 继承自 User 并在 Trainee 中添加了两个 String 参数。现在我设法制作了 User 的复制构造函数,但我对 Trainee 的复制构造函数不满意。User 拷贝构造函数的代码是这样的:

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);

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

预先感谢您的回答和帮助。

4

2 回答 2

10

最好使“完整”复制构造函数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;
}

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

Trainee 现在,尚不清楚在不指定现有用户信息的情况下创建 a 是否有意义......或者可能以其他方式指定它。在这种情况下,您可能确实需要两组单独的构造函数——一组用于复制构造函数,一组用于“只给我所有值”构造函数。这真的取决于你的背景——我们不能仅仅从这一点上看出来。

在这种情况下,您将稍微违反“一个主构造函数”规则,但您可以认为有两个主构造函数,每个用于不同目的的一组构造函数。从根本上说,你会遇到“继承变得混乱”——这太常见了:(

于 2012-11-29T21:33:38.637 回答
0

我会做:

 public Trainee (User clone) // By specifying `User` you allow the use in your code
 {
    super (clone);
    if (clone instanceof Trainee) {
      this.osia = clone.getOsia();
      this.dateNaiss = clone.getDateNaiss());
    }
 }
于 2012-11-29T21:34:25.523 回答