我有四個班。 Person
類,以及另外三個,Student
,Professor
,Tutor
,其中每個擴展類Person。類人員有2個變量studentID
和staffID
。但是,只有學生可以有studentID != null
,導師和教授可以有staffID != null
。現在,當創建新對象Student時,如何確保無論員工ID始終保持爲空? staffID必須留在Person類中,所以不要移動它。Java,如何讓上層類的變量保持爲空;如何從子類中隱藏變量?
回答
創建接口限制操作:
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);
整個繼承點是隻有對父類有效的值和函數(成員)放在父類中,並且任何特定於子元素的成員都放在子類中。
不要濫用OO,將staffID
移到您的孩子班。
我的建議是建立一個Staff
類,它包含staffID
,有它繼承Person
,然後讓Professor
並從中Tutor
繼承。然後將studentID
轉換爲Student
類。這種方式只有Professor
和Tutor
有權訪問staffID
和Student
沒有,反之亦然studentID
。所有類別仍可分配給Person
類型。
不幸的是,導師是一名學生,所以導師實際上擴展了學生,並且不能擴展員工。作爲一個班級,學生和導師之間的唯一區別實際上是員工ID。 – vedran
好吧,請刪除'Staff'的概念並將'staffID'移動到'Professor'中。 _編輯:耶,這些讚揚使我的代表在1337以上! – Polynomial
該studentID
應該是Student
而不是Person
的成員。同樣Professor
和Tutor
都應該擴展類Faculty
具有staffId
這又延伸Person
將此變量私人和創建getter和setter。 根據類實現不同的方法行爲。 對於stasfs - 保護設置studentId 爲學生 - 保護設置staffId。
不擴展Person類。改用組合物。
如果您需要多態性,請創建一個Blammy界面,爲學生,教授和導師提供一個通用界面。學生ID和員工ID可能或不可能成爲Blammy界面的一部分。
每個班級的學生,教授和輔導老師都會包含一個Person和一個代理人的私人實例,用於他們想要公開的任何Person功能。
學生將擁有studentId數據成員,教授和導師將擁有staffId數據成員。 profesor和tutor的getStudentId()總是返回null,並且get的staffId也會一直返回null。
使變量私人,創建getters和setter。然後讓你的構造函數初始化這兩個變量,並簡單地傳遞null作爲教師的學生ID,null作爲學生的staffID。
構造--->
public Person(int staffID, int studentID){
this.staffID = staffID;
this.studentID = studentID:
}
在初始化---->
Student student = new Person(null, 1234);
- 1. 隱藏子類變量
- 2. 如何從視圖中隱藏變量?
- 3. 隱藏「靜態」類變量
- 4. 如何隱藏變量laravel
- 5. 如何隱藏變量?
- 6. Vb.net如何從類的其餘部分隱藏這個變量?
- 7. 從javascript變量隱藏輸入類型
- 8. $ _SESSION變量保持爲空
- 9. 在子類中重新定義一個變量類型(即變量隱藏)
- 10. 如何從子類訪問主類的公共常量變量?
- 11. 隱藏回聲保持變量bash
- 12. 傳遞變量,並保持隱藏
- 13. 成員變量保持類
- 14. Ç - 如何保持變量
- 15. 如何保持靜態const變量作爲類的成員
- 16. Flash上隱藏的變量變量
- 17. 如何在Tensorflow中設置可變數量的隱藏層?
- 18. 如何在C擴展中的Ruby層隱藏實例變量?
- 19. 捕獲的變量隱藏在lambda中傳遞變量。如何取消隱藏?
- 20. 如何隱藏表,如果變量爲空
- 21. 如何訪問從父類擴展的子類中的變量
- 22. 如何讓變量獨佔於類?
- 23. 如何從主類中的子類獲取變量?
- 24. 如何保持會話變量不變?
- 25. C#:如何使類變量持久
- 26. 讓變量保持htmlcollection
- 27. 如何將類變量轉換爲Python中的實例變量?
- 28. 如何在applescript中使用函數時保持變量類型
- 29. 繼承的子類中的Java public/protected變量值爲空
- 30. 如何訪問子類中的受保護變量php5
充分利用私有變量,而子類制定者到執行政策。 –