java拷贝构造函数和继承

时间:2012-11-29 21:29:05

标签: java inheritance copy-constructor

经过一番搜索,我没有找到关于复制构造函数和继承的问题的任何好答案。 我有两个班:用户和实习生。学员继承自User,并将两个String参数添加到Trainee。 现在我设法创建了User的复制构造函数,但我对Trainee的复制构造函数不满意。 User copy构造函数的代码如下:

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

所以我的问题是:有更清洁的方法吗?我不能用超级?

提前感谢您的回答和帮助。

2 个答案:

答案 0 :(得分:9)

最好让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 是否有意义......或者可能以其他方式指定它。 可能在这种情况下你真的需要有两组不同的构造函数 - 一组用于复制构造函数,一组用于“只给我所有的值单独的“建设者。这实际上取决于你的背景 - 我们不能从中得知。

在这种情况下,您将略微打破“一个主构造函数”规则,但您可以想到存在两个主构造函数,每个构造函数用于不同目的。从根本上说,你正在遇到“继承变得混乱” - 这太常见了:(

答案 1 :(得分: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());
    }
 }