【发布时间】:2014-12-17 19:17:18
【问题描述】:
假设我有一个班级人如下:
public class Person {
String name;
int age;
}
和一些子类,如
public class Student extends Person {
// extra fields and methods
}
public class Teacher extends Person {
// extra fields and methods
}
现在,考虑到对于某些应用程序,我需要为每个人实例分配一个整数 id,但我不想扩展 Person 接口以在其中添加 getId() 和一个保存 id 的字段。一个简单的解决方案是使用如下包装器:
public class PersonWrapper extends Person {
public PersonWrapper(Person p, int id) { // assign the id and other fields }
public int getId() { return id; }
}
这样,客户端代码仍然可以与 Person 接口一起使用,并且可以被包装的人 被当作一个人对待。 这种方法的问题是 PersonWrapper 是 Person 的子类,而不是 Teacher 或 Student,这样的代码不会起作用:
Teacher t = new PersonWrapper(teacher, 1);
t.giveGrade();
当然,可以为Person 的所有子类创建具体的包装器类型,但我想知道是否有更优雅的解决方案。理想的解决方案是这样的:
public class PersonWrapper<T extends Person> extends T
所以任何 PersonWrapper 都是它包装的类型的子类,但在 Java 中是不可能的,我 怀疑这样的定义可能无法用任何语言进行。
在任何情况下,如何在不更改与 person 及其子类一起使用的客户端代码的情况下为子类分配 id,而不为每个子类创建具体的包装器?
【问题讨论】: