2011-10-26 74 views
3

我正在嘗試製作我們大學的模型課程管理系統(課程)。我偶然發現了的一個小侷限,擴展了,也就是說,某個類不可能擴展兩個類。這裏的模型:Java擴展替代品

     Professor 
        /     
      Staff 
     /  \      
    Person   Tutor    
      \  /  
      Student    

因此,我得到職員和學生擴展人和教授延長職員。現在,我和Tutor一起有一個小小的困境,Tutor本質上是一名學生(有studentID),但從某種意義上說,大學員工(持有集團講座,負責某個項目等)。由於我不能使用兩個擴展,有什麼其他的選擇,如果可能的話可以有人給一個非常簡單的例子implements?我已經看到了它的一個接口的例子,但我不完全確定如何在程序中使用它,因爲Student不是一個接口?

+0

你能至少發佈一個有效的模型使用像UML的東西?你的線條代表什麼?我希望不是他們的意思是「延伸」,因爲在那種情況下,你的「教授」,「工作人員」和「導師」不是「人」。我最後一次檢查我們在大學有人,而不是機器人教學生......等等,我應該從左到右讀模型嗎?一直下降? – WarrenFaith

+4

這是一個基本問題,但不是一個壞問題。用一個指向教程的鏈接寫一個答案,而不是抱怨和downvoting。 Stackoverflow是關於幫助。 –

+0

你有**使用Java嗎?如果沒有,像[Scala]或Ruby [混合](http://en.wikipedia.org/wiki/Mixin)的語言將更適合您的目的。由於Scala編譯爲Java字節碼,因此向您的導師/上級請求應該不會太多。 –

回答

8

不要使用繼承,使用組合:每個人都是一個Person,但有一個或多個角色:Student,Tutor,Professor,Staff。

或者可以選擇在工作人員和學生之間進行分工,並允許他們擔任角色。角色決定他們可以或不可以做什麼。

4

製作StudentStaff接口由Tutor實現。

Student將宣佈一個getStudentId()方法,並Staff將宣佈getLectures()getProjects()等。

+0

我不能讓一個學生一個接口,它仍然是一個類。然而,班級工作人員沒有這種限制。如果我可以讓員工成爲一個界面,那會有效,但是還有另一個問題,我不知道如何解決。如果我把員工變成一個界面,這意味着它失去了延伸,那麼Tutor和Professor將如何繼承person.firstName和person.lastName? – vedran

+0

對於您的學生問題,使用getStudentId()方法創建一個IStudent接口,並使您當前的Student類實現它。 對於另一個問題,也嘗試使用Person和Tutor的接口。然後你可以使接口彼此延伸。 – kgautron

2

使人,員工和學生的接口。如果您需要通用功能,請使用封裝。

4

你可以做這樣的事情。

interface Person { ... } 

interface Staff extends Person { ... } 

interface Student extends Person { ... } 

class Tutor implements Staff, Student { ... } 

class Professor implements Staff { ... } 

不幸的是,你不能把邏輯(即,場,非抽象方法)兩種StaffStudent,因爲他們都需要有類和一個Java類不能擴展兩個類。

你可以做StudentStaff(不能同時)一個抽象類,允許你把邏輯在裏面。不過,這樣做有點不雅,因爲沒有概念上的理由,爲什麼一個人應該是一個抽象類,而一個人應該是一個接口。理想情況下,他們都應該是抽象類,但爲此,您需要切換到MI語言。

interface Person { ... } 

interface Staff extends Person { ... } 

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

class Tutor extends Student implements Staff { ... } 

class Professor implements Staff { ... } 
0

正如其他人所指出的,要在Java中執行此操作,您需要定義接口而不是超類。 Java不允許多個擴展。

但是,可能有比繼承更好的選擇。在這種情況下,幾乎在任何情況下,如果我發現自己想要擁有一個子類可以擴展多個超類,那麼我試圖找到一種方法,用代理而不是繼承來模擬情況。

創建Person類,它包含了一組Role對象,其中Role是一個接口,並StudentStaff實施Role。然後一個人可以有多個角色,而不是「存在」多種類型的人。