考虑这种情况,
我分别有两个班级学生和荣誉学生。
class Student{
String name;
int roll;
Student(String name, int roll){
this.name = name;
this.roll = roll;
}
}
class HonorStudent extends Student{
int honorid;
HonorStudent(String name, int roll,int honorid){
this.name = name;
this.roll = roll;
this.honorid = honorid;
}
HonorStudent(String name, int roll){
this.name = name;
this.roll = roll;
}
}
现在,我可能希望将学生转换为HonorStudent。由于在这种情况下不允许向下转发,我不能这样做:
Student s1 = new Student("abc",123);
HonorStudent s = (HonorStudent)s1;
所以另一种方法是在HonorStudent中定义一个输入学生对象并返回HonorStudent的方法:
public static HonorStudent convertToHonor(Student s){
return new HonorStudent(s.name,s.roll);
}
如果只有两个属性(名称,滚动),这很方便,但如果我有很多属性说50怎么办?在这种情况下,我必须将每个属性输入HonorStudent?
我强烈认为可能有更简单的方法吗?
答案 0 :(得分:2)
您在询问是否有更方便的方法来执行此操作。如果我们只考虑将参数从一个对象复制到另一个对象,那么没有其他方法可以做到这一点。可能有办法通过为成员字段组提供对象或通过可以将具有相同名称的成员字段从对象复制到另一个的代码自动化来解决该问题。
小修补
但首先,让我们改进一下设计。不应在类层次结构中的类之间复制字段。所以,让我们消除这种重复:
public class Student {
private String name;
private int roll;
public Student(String name, int roll) {
this.name = name;
this.roll = roll;
}
public String getName() {
return name;
}
public int getRoll() {
return roll;
}
}
public class HonorStudent extends Student {
private int honorId;
public HonorStudent(String name, int roll, int honorId) {
super(name, roll);
this.honorId = honorId;
}
public int getHonorId() {
return honorId;
}
}
复制构造函数
如果确实需要复制对象,那么复制构造函数可能很有用。创建复制构造函数将允许您跳过仅将每个成员字段传递一个。
public Student(Student other) {
this.name = other.name;
this.roll = other.roll;
}
然后创建HonorStudent的学生部分变得更简单
public HonorStudent(Student student, int honorId) {
super(student);
this.honorId = honorId;
}
<强>设计强>
现在,对象改变其类型并不常见。所以这不常见。这通常通过不同类型的设计来解决。例如,honorId
可以是Student
类的一部分,因为我猜,学生可以获得此属性或将其松散。与荣誉相关的行为可以在附加到学生班级的其他课程中。
阅读behavioural design patterns可能很有用。根据用例和您要解决的问题,取决于选择哪种模式。