我有两个类:Student和Tutor。Tutor基本上是一个有facultyID的学生(Tutor扩展了Student)。一旦他的合同结束,他就会回到作为普通学生的身份。那么我能否以某种方式将他转换回之前的学生身份?
我有两个类:Student和Tutor。Tutor基本上是一个有facultyID的学生(Tutor扩展了Student)。一旦他的合同结束,他就会回到作为普通学生的身份。那么我能否以某种方式将他转换回之前的学生身份?
Student
类型,然后在需要时临时分配 TutorRole
的行为给每个 Student
实例。Student
类将包含一个类型为 TutorRole
的属性(成员变量),你可以在运行时添加或删除它。添加一个 isTutor()
方法将允许您以清晰简洁的方式确定学生是否为导师。
TutorRole
类将封装作为导师的行为(即方法)。/*
* The TutorRole can be set at runtime
*/
public class Student {
private String facultyId;
private TutorRole tutorRole = null;
public boolean isTutor() {
return !(tutorRole == null);
}
public void doTutorStuff() {
if(isTutor()) {
tutorRole.doTutorStuff();
}
else {
throw new NotTutorException();
}
}
public void setTutorRole(TutorRole tutorRole) {
this.tutorRole = tutorRole;
}
}
/*
* Ideally this class should implement a generic interface, but I'll keep this simple
*/
public class TutorRole {
public void doTutorStuff() {
// implementation here
}
}
/*
* Now let's use our classes...
*/
Student st = new Student(); // not a tutor
st.setTutorRole(new TutorRole()); // now a tutor
if(st.isTutor()) {
st.doTutorStuff();
}
st.setTutorRole(null); // not a tutor anymore
Tutor
类包含对一个 Student
对象的引用,但这取决于您将如何与学生和导师对象进行交互,以及您想要编写哪种代码。interface IStudent
{
String getName();
int getStudentId();
}
interface IFacultyMember
{
int getFacultyId( );
}
class Student
implements IStudent
{
String name;
int id;
public String getName( ) { return name; }
public int getStudentId( ) { return id; }
}
class Tutor
implements IStudent, IFacultyMember
{
Student student;
int facultyId;
public Tutor ( Student student, int facultyId )
{
this.student = student;
this.facultyId = facultyId;
}
public String getName( ) { return student.getName( ); }
public int getStudentId( ) { return student.getStudentId( ); }
public int getFacultyId( ) { return facultyId; };
}
Tutor
),该实例的运行时类型就已确定,无法再更改。Student
提供一个构造函数,该函数接受另一个 Student
实例并复制相关字段。这就是所谓的复制构造函数。这样,您可以轻松地基于您的 Tutor
创建一个新的 Student
实例,然后使用它。FacultyMember
类或其他类,并将 Student
和 Tutor
转换为角色。然后您可以稍后更改 FacultyMember
的角色。在Java中,您无法更改对象类型。可能实现您的方法最简单的方式是将Tutor中的所有参数克隆到一个新的Student对象中。
TutorToStudent()
这样的方法,并从Tutor创建一个新的Student。如果你进行强制类型转换,最终得到的对象仍然是Tutor。Student(Student original)
或者 Student toStudent()
方法创建一个与导师信息完全相同的新学生对象,并且丢弃原来的对象。这是一种快速而不太规范的方法。枚举类型Type
并在People对象中持有此字段,这比上面的方法更简单,但可扩展性较差,真正依赖于Tutor和Student之间的差异程度。没有所谓的“将他转换回学生”,他是一位导师,而导师已经是一名学生。
然而,泛化对象的访问可能具有一定的价值,这样您只需使用学生方法。Java 中有几种惯用语可供选择。
1)您可以在代码中专门使用学生 API,但除了导师部分之外。
2)您可以为您的对象编写“toStudent/toTutor”方法,使它们能够返回特定于角色的对象。
//我更喜欢的方式 3)您可以使用接口。将导师和学生都作为接口,并使用接口实现构建您的对象。如果您使用最小接口引用对象,而不是重量级继承模式,那么您的代码在未来可能会更好地扩展。
boolean isTutor;
成员或者简单地保持一个既是学生又是导师的名单就足够了。没有必要仅仅因为你可以而用面向对象的模式来建模所有东西。 - kritzikratzi