假設你是個導演,當你想拍攝一幕「洪七公說了一聲看招後,使出降龍十八掌」的戲,應該如何做到呢?導演應該先設計好洪七公這個角色,再找一個場地與演員來真實地演出這場戲。
設計階段就是類別的設計,真實演出時,就是產生物件並呼叫方法。
設計洪七公類別之前先提醒,為了容易瞭解,我會在這個範例中的類別名稱、屬性與方法名稱使用中文,但是建議日後設計類別時,為避免日後國際化問題,應避免使用中文為類別名稱或方法名稱。
設計構思階段
洪七公也是個人,而人都有姓名與體力,因此先設計「人」類別是為了日後若有其他角色時,可以重覆使用。而「洪七公」類別則繼承了人的特色,筆者為「人」類別設計姓名與體力兩個屬性,又加了一個方法「說」,這個方法可以接收一個字串後印出。
public class 人 { String 姓名; int 體力 = 100; public void 說(String words){ System.out.println(姓名 + "說:" + words); } }
接下來設計洪七公類別,由於洪七公也應該有「人」的所有屬性與方法,筆者將洪七公繼承了「人」類別,並設定其姓名,由於練武之人體力較佳,因此應改變父類別(人)的體力為200。又因洪七公擁有絕世武功,我新增了一個新的方法叫「降龍十八掌」,類別設計如下:
public class 洪七公 extends 人 { public 洪七公() { 姓名 = "洪七公"; 體力 = 200; } public void 降龍十八掌(){ System.out.println(姓名 + "發出陣陣掌風,使出降龍十八掌"); } }
演出階段
接下來可以演出先前「洪七公說了一聲看招後,使出降龍十八掌」這幕戲了,筆者新增一個具有main方法,可測試的類別叫Tester,用來演出這場戲。先以一個演員hong,依照劇本所設計的洪七公來演出:
public class Tester { public static void main(String[] args) { 洪七公 hong = new 洪七公(); hong.說("看招"); hong.降龍十八掌(); } }
執行的結果為:
洪七公說:看招 洪七公發出陣陣掌風,使出降龍十八掌
進階設計
假如筆者的需求是設計有關遊戲的對戰,遊戲中有歐陽峰與洪七公兩個角色,歐陽峰擁有體力180,內力值是400,發出蛤蟆功後自己會降低體力值40與內力值50,而對方會失去體力值80。而洪七公擁有的體力是200,內力值是500,發出降龍十八掌時自己會降低體力值60與內力值80,而對方會失去體力值120。整理如下表:
說明 | 洪七公 | 歐陽峰 |
預設體力值 | 200 | 180 |
預設內力值 | 500 | 400 |
使出大絕招消耗體力值 | 60 | 40 |
使出大絕招消耗內力值 | 80 | 50 |
對方失去體力值 | 120 | 80 |
「歐陽峰使出蛤蟆功攻擊洪七公後,洪七公受傷後也使出降龍十八掌回擊」
由於設計過程比起上一節要來得複雜,先將兩個類別的架構整理後,再進行類別的實際設計:
洪七公類別
public class 洪七公 extends 人 { int 內力 = 500; public 洪七公() { 姓名 = "洪七公"; 體力 = 200; } public void 降龍十八掌(){ System.out.println(姓名 + "發出陣陣掌風,使出降龍十八掌"); } public void 降龍十八掌(人 p){ System.out.println(姓名 + "發出陣陣掌風,使出降龍十八掌打向" + p.姓名); 體力 = 體力 - 60; 內力 = 內力 - 80; p.體力 = p.體力 - 120; System.out.println(" 對手" + p.姓名 + "體力剩餘:" + p.體力); } }
上述程式碼為類別新設計一個新的屬性(第2行)與新的方法(第12至18行),第12行的方法降龍十八掌(人 p)接收一個人物件,才能在該方法中操作被攻擊人的體力值。第14,15行扣除洪七公自己的體力與內力值,第16行則扣除被攻擊人的體力值,最後第17行印出被攻擊人被扣除後所剩餘的體力值。
歐陽峰類別
public class 歐陽峰 extends 人 { int 內力 = 400; public 歐陽峰() { 姓名 = "歐陽峰"; 體力 = 180; } public void 蛤蟆功(){ System.out.println(姓名 + "發出呱呱怪聲,使出蛤蟆功"); } public void 蛤蟆功(人 p){ System.out.println(姓名 + "發出呱呱怪聲,使出蛤蟆功打向" + p.姓名); 體力 = 體力 - 40; 內力 = 內力 - 50; p.體力 = p.體力 - 80; System.out.println(" 對手" + p.姓名 + "體力剩餘:" + p.體力); } }
上述程式碼為類別新設計一個新的屬性(第2行)與新的方法(第12至18行,第12行的方法蛤蟆功(人 p)接收一個人物件,才能在該方法中操作被攻擊人的體力值。第14,15行扣除歐陽峰自己的體力與內力值,第16行則扣除被攻擊人的體力值,最後第17行印出被攻擊人被扣除後所剩餘的體力值。
實例操作程式
遊戲場景演出「歐陽峰使出蛤蟆功攻擊洪七公後,洪七公受傷後也使出降龍十八掌回擊」,在此設計一個Tester2類別,於main方法內演練實例,程式碼如下:
public class Tester2 { public static void main(String[] args) { 洪七公 hong = new 洪七公(); 歐陽峰 oyan = new 歐陽峰(); oyan.蛤蟆功(hong); hong.降龍十八掌(oyan); } }
執行結果如下:
歐陽峰發出呱呱怪聲,使出蛤蟆功打向洪七公 對手洪七公體力剩餘:120 洪七公發出陣陣掌風,使出降龍十八掌打向歐陽峰 對手歐陽峰體力剩餘:20