本篇故事:在中古世紀,表演魔術為生的愛未未被當成魔女而遭受教會組織的追殺,逃亡的過程中進入了一間詭異的圖書館,不小心招喚出詐欺惡魔伊莉莎白,並與之締結了契約,愛未未以生命為代價,借得了惡魔的力量,成為了惡魔使者,終於有了與教會組織對抗的能力。
在本範例中,我會先創造愛未未使者、伊莉莎白惡魔兩個物件,然後再創造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;
}
}
契約的類別:在這裡扮演結合類別的角色。
/* 契約類別 */
// 結合類別:結合使者與惡魔。
// 透過契約,使者可以借得惡魔的力量,但也必須付出相應的代價。public class Contract {// 編寫人:Lancelot Cheng
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 :我新增了解除結合的方法於契約類別中,同時為了程式碼比較簡便,刪除了使者類別與惡魔類別的資料顯示方法。
沒有留言:
張貼留言