Java 程式設計()  第九章 繼承性與多形性運用  上一頁    下一頁

 

9-2 簡單的繼承關係

內容:

  • 9-2-1 範例研討:建構人事資料

  • 9-2-2 自我挑戰:建構客戶資料

9-2-1 範例研討:建構人事資料

A)程式功能:Ex9_1.javaPersonal.javaEmployee.java

『展鵬網路行銷公司』期望建立一套較完整的人事資訊系統,對每位員工包含有:身分證字號、姓名、性別、員工代號、服務部門、職位、地址、電話等資料。希望此系統所登錄資料能與外部其他系統結合,對內也可以讓其他資訊系統引用。規劃員工資料內容後,請製作一個簡單的輸入/輸出程式,測試是否可行,期望操作介面如下:

G:\Examples\chap12\Ex9_1>java Ex9_1

**** 建立員工基本資料  ****

請輸入員工姓名 =>張有志

身分證字號 = >M111234567

員工代號 (700 ~ 900) =>720

性別 (/) =>

服務部門 =>製造課

職位 = >技術員

地址 =>高雄市三民區

電話 (##-#######) =>07-43123

 

**** 列印員工基本資料 *****

              

(720 M111234567 張有志 ) 製造課  技術員  07-43123  高雄市三民區

B)製作技巧研討:

該公司要求所建立的人事資訊系統,儘量可以與外界或內部其他資訊系統結合,即是人事資料的屬性儘量能相容於其他系統。因此,必須由對內與對外兩方面來思考,以下分別說明之。

(1) 對外共通屬性:Personal.java

在台灣辨識國人之間大多採用哪些屬性,將這些屬性加入人事資訊系統內,與外界溝通則可透過它們。國人資料所採用的屬性有:姓名、身分證字號、性別、出生地、出生日,除了身分證字號外,在台灣內要找到兩個人其他資料都是相同的,應該很困難才對。於是將描述『國人』的屬性製作成 Personal 類別,如下:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

// Personal.java

 

class Personal {

    private String SID;          // 身分證號, 10 個字元

    String name;               // 姓名

    String sex;                 // 性別 (男或女)

    String birthDate;            // 出生日期 (//)

    String bithPlace;            // 出生地

 

     int setSID(String No) {         // 設定身分證號方法

         if (No.length() != 10) {

              System.out.printf(" 10 個字元, 請重新輸入 !!");

              return 0;

         }

         else {

             SID = No;

             return 1;

         }

     }

     String getSID() {            // 讀取身分證號方法

         return SID;

    }

}

上述範例中,Personal 類別包含 5 個變數成員,其中 SID(身分證號)為隱藏性變數,利用 2 個方法成員(setSID() getSID())作為該變數的輸入與輸出埠口。Personal 類別制定完成之後,不僅可以由它延伸出管理公司內的人事系統,也可以製作出公司管理非本司員工的客戶管理系統,甚至其他應用管理系統。Personal 類別可存取成員有:(如圖 9-4 所示)

(a) int setSID(String No):設定身分證號碼。引數 No 格式正確則設定身分證號碼,並回傳 1 表示執行正常;否則回傳 1,表示身分證號碼格式不對。

(b) String getSID():讀取身分證號碼。

(c) String name:儲存姓名之變數(字串格式)。

(d) String sex:儲存性別之變數。

(e) String birthDate:儲存出生日之變數。

(f) String birthPlace:儲存出生地之變數。

9-4 人事資料基本類別

(2) 對內相容屬性:Employee.java

人事系統內所登錄的員工資料,大多會其他系統所引用;規範員工資料屬性時,也必須考慮到其他系統的相容性如何。首先我們增加了員工代號屬性,當作員工在公司內的唯一識別。如果還是利用身份證字號識別,它屬於字串型態,搜尋比對較不方便。另外,再依展鵬公司的環境,增列了:服務部門、職位、電話與地址等 4 個屬性,又引用對外共通屬性:身份證號、姓名與性別等 3 個屬性。合計共 8 個屬性(如圖 9-5 所示)。依此,我們建構了 Employee 類別,它繼承來自 Personal 屬性,程式範例如下:

01

02

03

04

05

06

07

08

09

10

11

12

//Employee.java

 

/* Personal.class 需於同目錄下 */

class Employee extends Personal {

 

    int ID;                    // 員工代號

    String depart;             // 所屬部門

    String position;           //    

    String addr;               //    

    String tel;                //    

}

其實上述範例,Employee 類別繼承 Personal 屬性的所有成員,又增列 4 個成員,合計共有:SIDnamesexbirthDatebirthPlace(以上父類別 Personal 具有),IDdepartpositionaddr tel(以上由 Employee 宣告產生),合計 10 個變數成員,以及 setSID() getSID() 兩個方法成員。但依照系統的需求,吾人也許會捨棄 birthDate birthPlace 兩個變數成員不用(也許有一天會拿來用)。

9-5 Employee 類別產生

C)程式範例:Ex9-1.java

完成後 Employee 類別的規劃,吾人則可以編制一個簡單程式來測試結果如何,程式範例如下:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

//Ex9_1.java

 

/* Employee.class 需於同目錄下 */

import java.io.*;

public class Ex9_1 {

   public static void main(String args[]) throws IOException {

       BufferedReader keyin = new BufferedReader(new

                              InputStreamReader(System.in));

       Employee emp = new Employee();

       String tempS;

        

       System.out.printf("**** 建立工作員資料  ****\n");

       System.out.printf("請輸入員工姓名 =>");

           emp.name = keyin.readLine();

       System.out.printf("身分證字號 = >");

           tempS = keyin.readLine();

           while (emp.setSID(tempS) == 0) {

                System.out.printf("請重新輸入 =>");

                tempS = keyin.readLine();

           }

       System.out.printf("員工代號 (700 ~ 900) =>");

          emp.ID = Integer.parseInt(keyin.readLine());

       System.out.printf("性別 (/) =>");

           emp.sex = keyin.readLine();

       System.out.print("服務部門 =>");

           emp.depart = keyin.readLine();

       System.out.printf("職位 = >");

           emp.position = keyin.readLine();

       System.out.printf("地址 =>");

           emp.addr = keyin.readLine();

       System.out.printf("電話 (##-#######) =>");

           emp.tel = keyin.readLine();

 

        System.out.printf("**** 列印員工基本資料 *****\n");

        System.out.printf("          “);

System.out.printf(“       \n");

        System.out.printf("(%d %s %s %s)",

emp.ID, emp.getSID(), emp.name, emp.sex);

        System.out.printf("\t%s %s %s  %s\n",

emp.depart, emp.position, emp.tel, emp.addr);

    }

}

製作完成上述 3 個原始程式之後,即可將他編譯成中界檔(bytecode),但需由 Personal.java 開始,接著是 Employee.java,最後才編譯 Ex9_1.java,執行範例如下:

G:\Examples\chap12\Ex9_1>javac Personal.java

 

G:\Examples\chap12\Ex9_1>javac Employee.java

 

G:\Examples\chap12\Ex9_1>javac Ex9_1.java

 

G:\Examples\chap12\Ex9_1>dir/b/w

Employee.java

Personal.java

Ex9_1.java

Personal.class

Employee.class

Ex9_1.class

9-2-2 自我挑戰:建構客戶資料

A)程式功能:PM9_1.java

展鵬行銷公司希望建立一套客戶管理系統,針對每位客戶登錄:身份證字號、姓名、性別、生日、購買商品、購買金額、電話與地址等 8 種資料。請規劃後編寫一簡單程式測試是否可行,期望操作介面如下:

G:\Examples\chap12\PM9_1>java PM9_1

**** 建立客戶基本資料  ****

請輸入客戶姓名 =>劉靜儀

身分證字號 = >A123412345

性別 (/) =>

生日(//) =>71/3/12

購買商品 = >化妝水

購買金額 = >5000

地址 =>台北市中山北路

電話 (##-#######) =>02-3451234

**** 列印客戶基本資料 *****

身份證號                

(A123412345 劉靜儀 71/3/12)  化妝水 5000 02-3451234  台北市中山北路

B)製作技巧提示:

如同範例 Ex9-1 一樣,基本資料還是繼承自 Personal 類別較為妥當,編制 Customer 類別的原始程式如下:

01

02

03

04

05

06

07

08

09

10

11

//Customer.java

 

/* Personal.class 需於同目錄下 */

class Customer extends Personal {

 

    String product;          // 購買產品

    int buying;              // 購買金額

    String addr;             //    

    String tel;              //    

}

Customer 類別產生了 productbuyingaddr tel 4 個屬性,再繼承自 Personal 類別取出 SIDnamesex birthDate 4 個屬性(如圖 9-6 所示),即可滿足展鵬公司的要求。

9-6 Customer 類別產生

C 程式範例:

吾人可利用 Customer 類別宣告客戶物件,再依序輸入資料與輸出客戶所有資料,請參考 Ex9_1.java 範例製作本範例的主程式(PM9-1.java),本書不再贅言。

 

翻轉工作室:粘添壽

 

Java 程式設計(二) 含物件導向

 

 

翻轉電子書系列: