9-3 覆蓋繼承成員
9-3-1 繼承性的覆蓋 子類別成員的名稱與父類別成員相同時,則表示覆蓋了父類別成員,如果需要取用原父類別成員則利用 super 與 this 區分。譬如父類別有 addr 變數成員,子類別除了繼承父類別的 addr 成員之外,也自行再宣告一個 addr 變數成員(兩者名稱相同)。基本上,子類別下的 addr 會覆蓋了父類別的 addr,但事實上還是存在兩個不同變數(記憶體位址不同),吾人可利用 super.addr(父類別)與 this.addr(子類別或 addr 即可)來分辨。 9-3-2 範例研討:員工薪資資料建檔 (A)程式功能:Ex9_2.java 展鵬行銷公司期望建立一套員工薪資管理系統,目前思考該系統針對某位員工資料為:員工姓名、員工代號、底薪、加班時數、戶籍地址與通訊地址等 5 種屬性。其中依勞基法規定底薪不可以低於 15800 元,每月加班時數不可超過 45 小時。登錄資料時如有違背規定,系統會重複要求重新輸入。設計完成資料屬性後,請編寫一簡單程式,測試系統是否可做資料輸入與輸出,期望操作介面如下:
(B)製作技巧研討: 公司裡大多希望各系統之間的資料能夠相容,對於爾後資料搬移會比較容易。之前我們幫展鵬公司設計了人事管理系統(Ex9_1 範例),也制定了公司內人事資料的標準格式(Employee 類別)。因此,希望員工薪資資料也是由人事資料延伸下來。Employee 類別包含有:員工代號(ID)、身分證號(SID)、姓名(name)、性別(sex)、服務部門(depart)、職位(position)、電話(tel)與地址(addr)。然而依照薪資管理系統,需要每位員工的:員工代號(ID)、姓名(name)、底薪(payment)、加班時數(extra)、通訊地址(addr)與戶籍地址(addr);其中員工代號、姓名與戶籍地址可以繼承自 Employee 類別,其他屬性可能需要自行宣告產生(Salary 類別,如圖 9- 7 所示)。但有兩個地址名稱相同,一個是父類別的 addr 代表戶籍地址,另一者是子類別的 addr 代表通訊地址,因此必須利用 super.addr 與 addr 作之間的區別。依照上述的概念,我們製作了宣告員工薪資資料的 Salary 類別,再編寫主程式(Ex9_2.java)引用該類別,測試其結果如何。
圖 9-7 Salary 類別產生 (C) 程式範例:Salary.java 依照上述的概念,我們製作了員工薪資類別 Salary,也繼承了員工基本資料類別 Employee,原始程式如下:
Salary 類別包含下列成員:( 僅擷取本範例所需部份) (1) 變數成員:ID、name、super.addr(以上繼承自 Employee),以及 payment、Extra 與 addr(通訊地址,以上是自行宣告)。 (2) 方法成員:setPayment()、getPayment、setExtra()、getExtra、setHomeAddr()、以及 getHomeAddr(),最後兩個方法是設定與取得父類別的 addr 屬性(戶籍地址) (D)程式範例:Ex9_2.java 設定完成 Salary 類別之後,吾人製作一個簡單程式(Ex9_2.java),功能是輸入員工薪資資料,再印出輸入的結果如何;其中儲存員工資料的物件,即是由 Salary 類別生產生。
9-3-3 自我挑戰:建立客戶會員資料 (A) 程式功能:PM9_2.java 『展鵬網路行銷公司』為了增進與客戶之間的關係,而制定了會員制度;首先思考以下策略: (1) 客戶累積購買金額超過 3萬元,可選擇加入會員,一般會員(C 級)購買商品打九折。 (2) 新進會員有效期為 1 年,如當年累積金額超過 3 萬元者,會員有效期延長 1 年。 (3) 如果一般會員(C 級)當年購買累積金額超過 3 萬元後,自動升級為白金會員(B 級),購物打八折。 (4) 如果白金會員當年購物超過 6 萬元後,自動升級為鑽石會員(A 級),購物打七折。 為了客戶隱私權問題,系統不可任意查閱客戶身份證字號與出生日期,但有時候公司還是需要知道客戶身份證號碼。經過多方的考慮,客服部目前規劃會員的基本資料為:身份證號碼(SID)、會員號碼(SID)、姓名(name)、累積金額(buying)、有效日期(validDate)、地址(addr)與電話(tel),其中身份證號碼需要特定程序才可以查閱或修改,以保持客戶的隱私權。另外,會員號碼由一個英文字母連結 5 個數字,英文字 A、B、C 代表會員級數(鑽石、白金或一般),5 個數字表示會員號碼(不變的)。則可能會員代號是 A00001 ~ C10000,設計這樣的目的是會員身份可能隨購買金額改變(上升或下降)。期望操作介面如下:
(B) 製作技巧提示: 依照公司規定,客戶需累積購買金額後,才可以成為會員,享有折扣優惠,由此可見,會員資料大多來自客戶資料,設計會員類別(Member)時,也需繼承自客戶類別(Customer,請參閱範例 PM9_1)。Customer 類別具有:身份證號(SID)、姓名(name)、性別(sex)、生日(birthDate)、購買商品(product)、金額(buying)、地址(addr)與電話(tel)。如 Member 類別繼承自 Employee 類別,可引用:姓名(name)、身份證號(SID)、購買金額(buying)、電話(tel)與地址(addr),再自行宣告會員代號(SID)與有效日期(validDate)即可。但身份證號與會員代號變數名稱相同,吾人以 super.SID 與 SID 區分(如圖 9- 8 所示)。
圖 9-8 Member 類別產生 另外,系統要求會員代號是由會員類別(A、B、C),與 5 個數字的會員號碼組成(10000 ~ 99999),又會員類別是由累積購買金額判定。因此,輸入會員資料時,僅輸入會員號碼與累積金額,系統會自動產生會員代號(A10000 ~ C10000)。 吾人依照上述概念,建立 Member 類別,編寫一主程式引用該類別,再輸入會員資料看系統是否可行。 (C)程式範例提示:Member.java Member 類別產生的過程是 Personal => Customer => Member,因此 Member 類別裡可引用原 Personal 與 Customer 所宣告的任何成員(變數或方法)。
其中,super.setSID()(第 40~43 行)呼叫父類別(Personal 類別)方法,功能是設定 SID 變數成員(身份證號)內容,執行正常則傳回 1;否則傳回 0。然而,Member 類別可直接引用成員有: (1) 變數成員:姓名(name)、有效日期(validDate)、購買金額(buying)、電話(tel)與地址(addr)。 (2) 方法成員:設定身份證號(int setPerSID(String))、讀取身份證號(String getPerSID())、設定會員代號(int setSID(String))與讀取會員代號(String getSID)。 (D)程式範例提示:PM9_2.java 吾人可利用 Member 類別宣告會員物件,再依序輸入資料與輸出會員所有資料,請參考 Ex9_2.java 範例製作本範例的主程式(PM9-2.java),本書不再贅言。
|
翻轉工作室:粘添壽
Java 程式設計(二) 含物件導向
翻轉電子書系列:
|