2021年6月26日 星期六

JAVA 物件導向的概念-10 結合類別

  本篇故事:在中古世紀,表演魔術為生的愛未未被當成魔女而遭受教會組織的追殺,逃亡的過程中進入了一間詭異的圖書館,不小心招喚出詐欺惡魔伊莉莎白,並與之締結了契約,愛未未以生命為代價,借得了惡魔的力量,成為了惡魔使者,終於有了與教會組織對抗的能力。

  簡單的說,兩個類別間的結合是透過第三個類別完成,則第三個類別稱為結合類別。僅僅只是第三個類別分別與第一和第二個類別有結合關係,概念上很簡單,只是[類別間的關係之結合關係]那篇文中的事情做兩次而已,如果您還沒看過,也許能去看一下[JAVA 物件導向的概念-06],以方便理解本篇中的範例。

  在本範例中,我會先創造愛未未使者、伊莉莎白惡魔兩個物件,然後再創造c_01契約物件,建立時同時結合前面兩個物件。結合後,愛未未可以使用伊莉莎的的方法。

使者的類別:
/* 使者類別 */
// 編寫人:Lancelot Cheng
public class Envoy {
private String name, brithday, blood;
private String profession, weapon;
private int level, exp, oID;
private Contract envoyDemon;

// 建構子
public Envoy (int oID, String nn, String bD, String bb,
String pro, int lev, int ex, String wea) {
name = nn;
brithday = bD;
blood = bb;
this.oID = oID;
profession = pro;
level = lev;
exp = ex;
weapon = wea;
}

public void toDemonContrant (Contract eD) {
envoyDemon = eD;
}
// *** 上一行重點,接契約物件。

public void powerOfDemon(){
if(envoyDemon != null) {
System.out.print(name + " 以自己的生命為代價,使用惡魔的絕招——");
envoyDemon.dem.useStunt(); // 透過契約使用惡魔的絕招。
}
else{
System.out.println("愛未未 沒有和任何惡魔締結契約,只是嚇嚇對方!");
}
}

}

惡魔的類別:
/* 惡魔類別 */
// 編寫人:Lancelot Cheng
public class Demon {
private String name;
private String title, stunt;
private int level, exp, oID;
private Contract envoyDemon;

// 建構子
public Demon (int oID, String nn, String tit, int lev, int ex, String stu) {
this.oID = oID;
name = nn;
title = tit;
level = lev;
exp = ex;
stunt = stu;
}

public void useStunt(){
System.out.println(stunt);
}

public void toEnvoyContrant (Contract eD) {
envoyDemon = eD;
}

}

契約的類別:在這裡扮演結合類別的角色。
/* 契約類別 */
// 結合類別:結合使者與惡魔。
// 透過契約,使者可以借得惡魔的力量,但也必須付出相應的代價。
// 編寫人:Lancelot Cheng
public class Contract {
int iD;
public Envoy env;
public Demon dem;

// 建構子。
public Contract( int iD, Envoy env, Demon dem) {
this.iD = iD;
this.env = env;
this.dem = dem;
env.toDemonContrant(this); // 把自己丟給使者物件。
dem.toEnvoyContrant(this); // 把自己丟給惡魔物件
}

// 解約的方法。
public void deContract(){
iD = 0;
env.toDemonContrant(null); // 把 null 丟給使者物件。
dem.toEnvoyContrant(null); // 把 null 丟給惡魔物件
env = null;
dem = null;
} // 注意上面的順序和建構子的不同,可以思考一下為什麼。

}

主程式:
/* 主程式 */
// 這個程式主要示範結合類別。
// 編寫人:Lancelot Cheng
public class Main {
public static void main(String[] args) {

// 產生 愛未未使者 物件。
Envoy ai = new Envoy(271828,"愛未未", "0912","O",
"魔術師", 99, 10000,"樸克牌");

// 產生 伊莉莎白惡魔 物件。
Demon elizabeth = new Demon(416, "伊莉莎白", "詐欺惡魔",
71, 8000, "虛幻的攻擊");

// 產生契約,同時將 愛未未使者 與 伊莉沙白惡魔 兩個物件丟給契約,結合兩個物件。
Contract c_01 = new Contract( 1, ai, elizabeth);


// 此時已經結合完成,所以可以使用愛未未使者物件中與惡魔有關的方法。
ai.powerOfDemon();

// 使用合約中,解除契約的方法。
c_01.deContract();

// 令契約容為 null,此動作或許可以讓電腦知道後面用不到它了,進而釋放記憶體。
c_01 = null;

// 再次使用與惡魔用關的方法,看結果可以知道用不出來了。
ai.powerOfDemon();

}
}

結果:
愛未未 以自己的生命為代價,使用惡魔的絕招——虛幻的攻擊
愛未未 沒有和任何惡魔締結契約,只是嚇嚇對方!

Process finished with exit code 0


  我手邊的書說結合類別使用在在多對一或多對多的結合關係,另外上網查,也有人表示非必要少用結合類別。所以我也不確定它的重要性,不過我還是寫了這個範例。我的範例仍然是一對一的結合,如果想要多對多,或多對一,在使者與惡魔類別中的契約物件宣告要宣告成陣列。

  再補充,範例中,我用契約結合了愛未未使者和伊莉莎白惡魔,但其實也是可以解約的,解除結合的方法我沒有寫在這邊,如果真的有人感興趣,請留言,我會補上。

  雖然使者和惡魔都有名字、等級和經驗,可以提出去創造一個共同的父類別,但這裡為了讓程式看起來不要太複雜,所以還是各別寫了。

  預告一下,我覺得惡魔使者愛未未的故事還不錯,之後會以這個故事為主題來寫 JAVA 程式,目標之一是寫出戰鬥的程式,可能是回合制或是時間軸制的。不過目前我還沒有使用圖的能力,所以只能是文字顯示了。

2021/6/29 :我新增了解除結合的方法於契約類別中,同時為了程式碼比較簡便,刪除了使者類別與惡魔類別的資料顯示方法。

沒有留言:

張貼留言