是否可以将用户转换为多个子类?我有User类,其中包含用户和教师共享的变量(即UUID,名称,地址)。我在用户和Instructors中的独特方法中有独特的方法。
在这个特定用例中,学生可以是教师,教师可以是学生。如何以只有学生可以调用学生方法的方式合并这两者,但如果他/她也是教师,可以调用特定于讲师的方法?我已经尝试将学生作为教师进行投射,但尽管对象是下面的用户,但它仍然出错。
答案 0 :(得分:0)
一个对象只能是一个类。使用new C(...)
创建对象时,会创建一个类型为类C
的对象,这是对象的类,直到对象被垃圾回收。您的情况似乎是您希望某些用户成为学生,某些用户成为教师,而某些用户成为两者。使用Java的类结构无法轻松解决这个问题。 (对于同时是学生和教师的用户,您可能会有一个StudentInstructor
课程。但这可能会导致StudentInstructor
课程与Student
和{{1}之间的代码重复如果你有两种以上的可能性,它可能会因为避免重复而变得混乱。如果你有两种以上的可能性,这根本不会扩展。)
可能是解决问题的最简单方法:
为每位用户提供学生和讲师方法;如果您为错误的用户调用它们,请让它们返回Instructor
。这意味着IllegalStateException
对象将有两个布尔值(可能在构造函数中设置,也可能由setter设置),一个告诉用户是否是学生,一个告诉他们是否是教师,两者都可能是真的。
User
还有其他解决方案。一种是定义定义方法的public class User {
boolean isStudent;
boolean isInstructor;
public void studentMethod() {
if (!isStudent) {
throw new IllegalStateException("studentMethod called when user is not a student");
}
...
}
// similarly for methods that apply only to instructors
// If there are multiple methods, you'll probably want to create methods like
// "checkStudent" or "checkInstructor" to move the above code and avoid
// duplication
和StudentDelegate
类,并使InstructorDelegate
类包含类型为User
和StudentDelegate
的实例变量,其中一个或两者都可以是非空的。或者,更好的是,使用InstructorDelegate
。 注意:我已经更改了java.util.Optional
和Student
中的名称以避免混淆。然后学生和教师方法将通过这些实例变量而不是直接通过{{ 1}}类。这样做的好处是可以将学生方法分成他们自己的类,同样也可以使用讲师方法,这有助于使您的代码更有条理。因此:
Instructor