假設我有以下繼承樹:多繼承,還是其他?
SDLBullet inherits from Bullet inherits from Entity
EnemyBullet inherits form Bullet inherits from Entity
現在我需要一個新的類,SDLEnemyBullet,這就需要平局在SDLBullet實現,碰撞在EnemyBullet實現。我將如何做到這一點?這是用多重繼承來解決的嗎?如果沒有,請隨時編輯我的問題和標題。如果是這樣,我將如何實施這樣的事情?
下面的某些代碼示例:
class Entity {
bool collision(Entity) = 0;
void draw() = 0;
}
class Bullet : Entity {
bool collision(Entity) {/*some implementation*/};
void draw() {/*draw me*/};
}
class SDLBullet : Bullet {
void draw() {/*draw me using SDL*/};
}
class EnemyBullet : Bullet {
bool collision(Entity) {/*if Entity is a fellow enemy, don't collide*/};
}
class SDLEnemyBullet : ????? {
/*I need SDLBullet::draw() here*/
/*I need EnemyBullet::collision(Entity) here*/
/*I certainly do not want EnemyBullet::draw nor SDLBullet::collision here*/
}
任何幫助,非常感謝!
(BTW:。這是一所學校的項目,像這樣的繼承樹有人建議我們沒有一個是從做不同的,更好的那阻止我們爲什麼我問的問題)
'Bulne'上的'EnemyBullet'有什麼特別的區別?是否有更多的實施,而不僅僅是碰撞檢測?因爲如果是這樣的話,你可以移除這個類,只需檢查一下Bullet來確定源(不管是否敵人)並忽略某些檢查,這樣你就不會爲敵人重複Bullet的每個子類。 – Grambot
如果你只是在尋找語法,它是'SDLEnemyBullet類:SDLBullet,EnemyBullet {/ * ... * /};',或者可能用訪問說明符(「'public'」)來裝飾。不過,不要這樣做,因爲它會創建兩個Bullet子對象的副本。 –
我想讓子彈與所有物體相撞,而不是與敵人發生碰撞的敵方子彈相撞。我也計劃製作一個PlayerBullet。我不知道我是否仍然需要普通的Bullet,但我打算保持靈活性,我可能有一天需要它。 (另外,現在一切都是正常的SDLBullet,所以如果玩家趕上他的子彈,他就會死亡,如果敵人與另一個敵人子彈相撞,它就會死亡,後者最讓我困擾) – Mats