3

我正在尝试制作我们大学课程管理系统的模型(用于课程)。我偶然发现了extends的一个小限制,即某个类不可能扩展两个类。这是模型:

                     Professor
                    /                  
             Staff
          /          \                       
    Person            Tutor            
           \         /      
             Student            

因此,我得到员工和学生扩展人员和教授扩展员工。现在我和class Tutor有一个小困境,他基本上是一个学生(有studentID),但在某种意义上是大学员工(举行小组讲座,负责某个项目等)。由于我不能使用两个扩展,还有什么其他选择,如果可能的话,有人可以举一个非常简单的例子?我已经看到了它的接口示例,但我不确定如何在我的程序中使用它,因为 Student 不是接口?

4

5 回答 5

8

不要使用继承,使用组合:每个人都是一个人,但有一个或多个角色:学生、导师、教授、员工。

或者可以选择在员工和学生之间进行划分,并允许他们担任角色。然后,这些角色决定了他们能做什么或不能做什么。

于 2011-10-26T11:53:29.840 回答
4

MakeStudentStaff接口由Tutor.

Student将声明一个getStudentId()方法,Staff并将声明getLectures()getProjects()

于 2011-10-26T11:25:35.480 回答
4

你可以做这样的事情。

interface Person { ... }

interface Staff extends Person { ... }

interface Student extends Person { ... }

class Tutor implements Staff, Student { ... }

class Professor implements Staff { ... }

不幸的是,您不能将逻辑(即,字段或非抽象方法)放在两者中StaffStudent因为它们都需要是类,而 Java 类不能扩展两个类。

您可以制作Student Staff(不能同时制作)一个抽象类,允许您将逻辑放入其中。但是,这有点不雅,因为没有概念上的理由为什么一个应该是抽象类而一个应该是接口。理想情况下,它们都应该是抽象类,但为此您需要切换到具有 MI 的语言。

interface Person { ... }

interface Staff extends Person { ... }

abstract class Student implements Person {
    long studentID;
    ...
}

class Tutor extends Student implements Staff { ... }

class Professor implements Staff { ... }
于 2011-10-26T11:38:46.053 回答
2

制作人员、员工和学生界面。如果您需要通用功能,请使用封装。

于 2011-10-26T11:26:24.590 回答
0

正如其他人所指出的,要在 Java 中执行此操作,您需要定义接口而不是超类。Java 不允许多重扩展。

但是可能有比继承更好的选择。在这种情况下,几乎在我发现自己想要让子类扩展多个超类的任何情况下,我都试图找到一种方法来用委托而不是继承来模拟这种情况。

创建一个Person包含一组Role对象的类,其中Role是一个接口,StudentStaff实现Role. 然后一个人可以有多个角色,而不是“成为”多种类型的人。

于 2011-10-26T11:52:16.377 回答