類別之間的關係有很多,除了常見的一般關係(繼承)外,還有結合關係(associations,也有翻成關聯關係)、可導覧的結合關係(navigable associtions)、相依關係(dependency)、一對多的關係(multiplicity)、聚合關係(aggregation)、組成關係(composition)。今天我做的範例是結合關係,下面開始說明。
勇者需要接任務打怪,所以我需要勇者的類別程和任務的類別,其中勇者是人類,所以勇者類別繼承人類類別。建立好後,我就可以創造第一個勇者物件和第一個任務物件了。但此時它們是彼此獨立的。
我想做的是是使用勇者物件的方法,可以看到任務物件的資訊;反過來也是,使用任務物件的方法,也可以看到勇者物件的資訊,所以我要結合它們。
實際操作的方式:
1,在勇者類別內宣告一個任務物件,而在任務類別內宣告一個勇者物件;
2,在勇者類別內寫下承接任務物件的方法,在任務類別內寫下承接勇者物件的方法;
3,在主程內產生一個勇者物件和一個任務物件,各自使用它們的承接方法接收對方;
上面就是結合的方式了,建議編譯後沒有出錯,再做接下來的修改或新增,此時可以在勇者類別的方法裡面使用任務類別的方法,反過來也可以在任務類別的方法中使用勇者類的方法。看你要如何修改囉!
父類別:人類。
/* 父類別:人類 */
// 編寫人: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);
}
}
子類別:勇者。
/* 子類別:勇者 */
// 找不到勇者的英文單字,估且用 BraveMan。
// 編寫人:Lancelot Cheng
public class BraveMan extends Human {
private String profession, weapon;
private int level, exp, braveID;
private Mission missionWork; // ***
// 建構子
public BraveMan (int braID, String nn, String bD, String bb, String pro, int lev, int ex, String wea) {
super(nn, bD, bb); // 使用父類別的建構子,一定要放在子類別建構子的第一個。
braveID = braID;
profession = pro;
level = lev;
exp = ex;
weapon = wea;
}
// *** 接任務
public void getMission (Mission mm) {
missionWork = mm;
}
public void showBraveMan(){
System.out.println("勇者編號:" +braveID);
showBasical(); // 因為有繼承父類別,所以可以直接使用其方法,父類別和子類別的方法名稱必須不同。
System.out.println("職業:" + profession + ";等級:" + level + ";經驗:" + exp + ";武器:" + weapon);
System.out.println("任務編號:" + missionWork.getMissionNumber()); // ***
}
}
任務:
/* 任務 */
// 只有勇者 BraveMan 才能接任務。
// 編寫人:Lancelot Cheng
public class Mission {
private int missionNumber;
private String name;
private boolean status;
private BraveMan braveWorker; // ***
// 建構子
public Mission(int miss,String na,boolean sta) {
missionNumber = miss;
name = na;
status = sta;
}
// *** 指定勇者
public void giveBraveMan( BraveMan braW) {
braveWorker = braW;
}
// ??? 取得任務編號
public int getMissionNumber() {
return missionNumber;
}
public void showMission(){
String doneif = "未完成";
if(status){
doneif = "已完成";
}
System.out.println("任務編號:" + missionNumber + ";任務名稱:" + name + ";執行結果:" + doneif);
System.out.println("====承接勇者的資料如下====");
braveWorker.showBraveMan(); // ***
}
}
主程式:
/* 主程式 */
// 這個程式主要示範物件的結合關係。
// 編寫人:Lancelot Cheng
public class Main {
public static void main(String[] args) {
// 產生梅林勇者物件
BraveMan merlin = new BraveMan(314159,"梅林", "0731","B",
"法師", 99, 10000,"神之智丈");
// merlin.showBraveMan();
System.out.println();
// 產生任務物件,並給值與展現其值。
Mission miss01 = new Mission(1, "殺掉火炎龍",true);
// miss01.showMission();
// *** 指定對方為自己的物件。
merlin.getMission(miss01);
miss01.giveBraveMan(merlin);
miss01.showMission();
}
}
結果:主程式最後一行使用的是任務的方法,但連勇者的資訊都一起展現出來了。
任務編號:1;任務名稱:殺掉火炎龍;執行結果:已完成
====承接勇者的資料如下====
勇者編號:314159
名字:梅林;生日:0731;血型:B
職業:法師;等級:99;經驗:10000;武器:神之智丈
任務編號:1
Process finished with exit code 0
這方法有點巧妙!真是有趣!然後,以後晚上不寫程式了,大腦會太活躍,很難睡著。
補充說明:勇者類別和任務類別在這個例子中是對等的。在其他的情況中,也可以寫成不對等的方式,僅僅只是兩個類別中,只設其中一個有承接對方物件的方法,然後在主程式中使用該類別之物件的承接方法去接物件而已。在這邊就不再寫範例了。
沒有留言:
張貼留言