2021年6月24日 星期四

JAVA 物件導向的概念-08 類別間的關係之一對多的關係(multiplicity)

   研究後我發現它基本上就是結合關係,在本篇我的範例是單向的,身為皇室的桂妮薇兒公主可以擁有兩個僕人,公主可以知道僕人的資訊,但僕人不能知道公主的資訊,所以是單向;一個公主兩個僕人,所以是一對多的關係(multiplicity)。皇室的類別中,可以有複數個僕人,所以我不是各別宣告不同名稱的僕人物件,而是直接宣告僕人物件陣列。


父類別:人類。
/* 父類別:人類 */
// 編寫人:Lancelot Cheng
public class Human {
public String name, brithday, blood;
// 我發現父類別的變數要設 public 子類別才能繼承,不然就是要設 getter and setter 吧。

// 父類別的建構子
public Human(String name, String brithday, String blood){
this.name = name;
this.brithday = brithday;
this. blood =blood;
}

void showBasical() {
System.out.println( "名字:" + name + ";生日:" + brithday + ";血型:" + blood);
}
}

子類別:僕人,由於它不用去承接任何物件,所程式碼很簡單。
// 編寫人:Lancelot Cheng
public class Servant extends Human {
private String mainjob;
private double salary;

public Servant (String nn, String bD, String bb, String mJ, double ss) {
super(nn, bD, bb); // 使用父類別的建構子。
mainjob = mJ;
salary = ss;
}

public void showJobSalary(){
showBasical();
System.out.println("主要工作:" + mainjob + ";月薪:" + salary);
}
}

子類別:皇室,由於要承接複數個僕人物件,所以有宣告僕人物件陣列與承接方法。
/* 子類別:皇室(royal family ) */
// 編寫人:Lancelot Cheng
public class RoyalFamily extends Human {
private String title, hat;
private int i = 0;
private Servant[] ser = new Servant[2];

// 建構子
public RoyalFamily (String nn, String bD, String bb, String tt, String hh) {
super(nn, bD, bb); // 使用父類別的建構子。
title = tt;
hat = hh;
}

public void haveServet ( Servant ser){
if(i < 2){
this.ser[i] = ser;
System.out.println("得到僕人!");
i++;
}
else{
System.out.println("已達僕人數上限!");
}
}

// 展現皇室成員檔案
public void showRoyalFamily() {
showBasical(); // 因為有繼承父類別,所以可以直接使用其方法,父類別和子類別的方法名稱必須不同。
System.out.println("頭銜:" + title + ";頭冠:" + hat);
System.out.println("----擁有以下僕人----");
if(i == 0) {
System.out.println("沒有僕人");
}
else {
for (int j = 0; j < 2 ; j++){
System.out.println("--------------------");
this.ser[j].showJobSalary();
}
}
System.out.println();
}
}

主程式:實作皇室物件桂妮薇兒與三個各有所長的僕人,將僕人指派給桂妮薇兒。
/* 主程式 */
// 編寫人:Lancelot Cheng
public class Main {
public static void main(String[] args) {

// 產生桂妮薇兒皇室成員物件,並給值與展現其值。
RoyalFamily guinevere = new RoyalFamily("桂妮薇兒",
"0614", "A", "公主", "鏡影神冠");

// 產生僕人
Servant al = new Servant("艾爾", "0702", "A", "幫主人洗澡", 10000.0);
Servant barty = new Servant("巴蒂", "0529", "B" , "說笑話", 30000.0);
Servant Olivia = new Servant("奧莉微亞", "0229", "O", "掃廁所", 100000.0);

System.out.println("締結契約前");
guinevere.showRoyalFamily();

// 指定僕人給桂妮薇兒
System.out.println("締結契約");
guinevere.haveServet(al);
guinevere.haveServet(barty);
guinevere.haveServet(Olivia);
System.out.println("締結契約完成");
System.out.println();

System.out.println("締結契約後");
guinevere.showRoyalFamily();

}
}

結果:
締結契約前
名字:桂妮薇兒;生日:0614;血型:A
頭銜:公主;頭冠:鏡影神冠
----擁有以下僕人----
沒有僕人

締結契約
得到僕人!
得到僕人!
已達僕人數上限!
締結契約完成

締結契約後
名字:桂妮薇兒;生日:0614;血型:A
頭銜:公主;頭冠:鏡影神冠
----擁有以下僕人----
--------------------
名字:艾爾;生日:0702;血型:A
主要工作:幫主人洗澡;月薪:10000.0
--------------------
名字:巴蒂;生日:0529;血型:B
主要工作:說笑話;月薪:30000.0


Process finished with exit code 0

  雖然主程式中指派了三個樸人給桂妮薇兒,但超出僕人數上限,所以最後一個僕人的契約締結不成功,桂妮薇兒只好自己掃廁所了。

  我自己私下又用這個程式做了其他嚐試,但沒有成功。我希望桂妮薇兒的僕人可以不只有僕人,也可以有用圓桌武士或其他人類,但我不想為此多寫幾行指令,所以我自己試了模糊化的寫法,但沒有成功,或許模糊化的寫法無法用在物件陣列上吧。

  我好奇的部份,如果我讓桂妮薇兒與每個僕人間的結合都是雙向的,那是否每個僕人都可以透過桂妮薇兒得到其他僕人的資料?有空再試看看吧。

沒有留言:

張貼留言