01 LOL 英雄聯盟遊戲需求分析
下面我們用設計 LOL 英雄聯盟遊戲的英雄的例子,說明多態爲什麼可以在修改或增加功能的時候,可以較少的改動代碼。
LOL 英雄聯盟是 5v5 競技遊戲,遊戲中有很多英雄,每種英雄都有一個「類」與之對應,每個英雄就是一個「對象」。
英雄之間能夠互相攻擊,攻擊敵人和被攻擊時都有相應的動作,動作是通過對象的成員函數實現的。
下面挑了五個英雄:
● 探險家 CEzreal
● 蓋樓 CGaren
● 盲僧 CLeesin
● 無極劍聖 CYi
● 瑞茲 CRyze
基本思路:
1、爲每個英雄類編寫 Attack、FightBack 和 Hurted 成員函數:
● Attack 函數表示攻擊動作;
● FightBack 函數表示反擊動作;
● Hurted 函數表示減少自身生命值,並表現受傷動作。
● 設置基類CHero,每個英雄類都繼承此基類
— —
02 非多態的實現方式
有 n 種英雄,CYi 類中就會有 n 個 Attack 成員函數,以及 n 個 FightBack 成員函數。對於其他類也如此。
如果遊戲版本升級,增加了新的英雄寒冰艾希 CAshe,則程序改動較大。所有的類都需要增加兩個成員函數:
這樣工作量是非常大的!!非常的不人性,所以這種設計方式是非常的不好!
— —
03 多態的實現方式
用多態的方式去實現,就能得知多態的優勢了,那麼上面的栗子改成多態的方式如下:
如果增加了新的英雄寒冰艾希 CAshe,只需要編寫新類CAshe,不再需要在已有的類裏專門爲新英雄增加:
所以已有的類可以原封不動,那麼使用多態的特性新增英雄的時候,可見改動量是非常少的。
多態使用方式:
根據多態的規則,上面的(1),(2),(3)進入到 CYi::Attack 函數後
分別調用:
所以要養成好習慣:
● 一個類如果定義了虛函數,則應該將析構函數也定義成虛函數;
● 或者,一個類打算作爲基類使用,也應該將析構函數定義成虛函數。
● 注意:構造函數不能定義成虛構造函數。
對於熱愛編程的人來說,有一羣一起學習一起解惑的小夥伴很重要!
小編有一個C/C++編程學習交流俱樂部,【點擊進入】!
還有編程學習文件(源碼,零基礎教程,項目實戰教學視頻),歡迎初學者和正在進階中的小夥伴們!