经过一番搜索,我没有找到关于复制构造函数和继承的问题的任何好答案。 我有两个班:用户和实习生。学员继承自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);
所以我的问题是:有更清洁的方法吗?我不能用超级?
提前感谢您的回答和帮助。
答案 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());
}
}