2011-11-01 47 views
0

我有四個班。 Person類,以及另外三個,Student,Professor,Tutor,其中每個擴展類Person。類人員有2個變量studentIDstaffID。但是,只有學生可以有studentID != null,導師和教授可以有staffID != null。現在,當創建新對象Student時,如何確保無論員工ID始終保持爲空? staffID必須留在Person類中,所以不要移動它。Java,如何讓上層類的變量保持爲空;如何從子類中隱藏變量?

+3

充分利用私有變量,而子類制定者到執行政策。 –

回答

2

創建接口限制操作:

package main; 

public interface IsStaff { 

    public void setStaffId(Integer staffId); 

    public Integer getStaffId(); 

} 



package main; 

public interface IsStudent { 

    public void setStudentId(Integer studentId); 

    public Integer getStudentId(); 

} 

創建Person類:

package main; 

public class Person { 

    protected Integer studentId = null; 

    protected Integer staffId = null; 

} 

創建與接口的學生和教職員工的子類來定義只允許操作:

package main; 

public class Staff extends Person implements IsStaff { 

    @Override 
    public void setStaffId(Integer staffId) { 
     this.staffId = staffId; 
    } 

    @Override 
    public Integer getStaffId() { 
     return staffId; 
    } 

} 



package main; 

public class Student extends Person implements IsStudent { 

    @Override 
    public void setStudentId(Integer studentId) { 
     this.studentId = studentId; 
    } 

    @Override 
    public Integer getStudentId() { 
     return studentId; 
    } 

} 

,並立即建立導師和教授:學生類的

package main; 

public class Tutor extends Staff { 

} 


package main; 

public class Professor extends Staff { 

} 

對象不具有可能影響staffId的操作,並且Staff類(包括Tutor和Professor子類)的對象沒有可能影響studentId的操作。根據需要添加其他操作(常見的可直接進入Person)。

作爲獎勵,你可以使用的接口,以更好地定義方法,像這樣:

public void assignParkingSpaceTo(IsStaff staffMember); 

public void issueLateSlipTo(IsStudent student); 
5

整個繼承點是隻有對父類有效的值和函數(成員)放在父類中,並且任何特定於子元素的成員都放在子類中。

不要濫用OO,將staffID移到您的孩子班。

我的建議是建立一個Staff類,它包含staffID,有它繼承Person,然後讓Professor並從中Tutor繼承。然後將studentID轉換爲Student類。這種方式只有ProfessorTutor有權訪問staffIDStudent沒有,反之亦然studentID。所有類別仍可分配給Person類型。

+0

不幸的是,導師是一名學生,所以導師實際上擴展了學生,並且不能擴展員工。作爲一個班級,學生和導師之間的唯一區別實際上是員工ID。 – vedran

+0

好吧,請刪除'Staff'的概念並將'staffID'移動到'Professor'中。 _編輯:耶,這些讚揚使我的代表在1337以上! – Polynomial

1

studentID應該是Student而不是Person的成員。同樣ProfessorTutor都應該擴展類Faculty具有staffId這又延伸Person

0

將此變量私人和創建getter和setter。 根據類實現不同的方法行爲。 對於stasfs - 保護設置studentId 爲學生 - 保護設置staffId。

0

不擴展Person類。改用組合物。

如果您需要多態性,請創建一個Blammy界面,爲學生,教授和導師提供一個通用界面。學生ID和員工ID可能或不可能成爲Blammy界面的一部分。

每個班級的學生,教授和輔導老師都會包含一個Person和一個代理人的私人實例,用於他們想要公開的任何Person功能。

學生將擁有studentId數據成員,教授和導師將擁有staffId數據成員。 profesor和tutor的getStudentId()總是返回null,並且get的staffId也會一直返回null。

0

使變量私人,創建getters和setter。然後讓你的構造函數初始化這兩個變量,並簡單地傳遞null作爲教師的學生ID,null作爲學生的staffID。

構造--->

public Person(int staffID, int studentID){ 
this.staffID = staffID; 
this.studentID = studentID: 
} 

在初始化---->

Student student = new Person(null, 1234);