2012-07-17 96 views
7

實現第二種情況唯一的一點是如果我想從一個Collidable派生而不是一個對象?如果是這樣的話,第一起案件何時有利,因爲第二起案件提供了更大的靈活性。哪種類型的繼承更可取?

兩個collidables只有一個純虛函數,Object是可以在屏幕上繪製的對象的基類(在我的情況下)。

^假設我正確理解下面的代碼(我也不太清楚TBH)

class Object 
class CollidableObject : Object 
class Actor : public CollidableObject 

class Object 
class Collidable 
class Actor : public Object, public Collidable 

編輯:

基於馬特/賽斯

class Object 
class Collidable 
class Clickable 
class Trackable 
class BlowUppable 
class Actor : public Object, public Collidable, public Clickable, public Trackable, 
       public BlowUppable 

class SomeObjectThatIsTakenForGrantedThatEverythingElseIsInherited : public Actor 

第一個例子是第二種情況,第二種情況是第一種情況。我想這是我看到的第一個案例的唯一用途。

@Luchian
這將是一個與原來不同的問題,因爲你的答覆既不是。

在這種情況下,是否存在將對象從is-a變爲has-a關係的區別?在每種情況下,爲了檢查碰撞,對象必須有一個標誌來知道是否應該檢查碰撞。在你的情況下,成員可以檢查它是否爲null,但在派生的情況下,對象本身告訴它是否可以碰撞。在數組/樹中,我可以將派生對象作爲參數傳遞,或者使用get()方法將hitbox作爲參數傳遞。

更深入,我有另一個類 - 使用所述第二殼體

class Hitbox : public Object, public Collidable 

和Actor類具有它作爲一個部件,其有碰撞將具有擊中格

class Actor : public Object 
{ 
    Hitbox *box; 
}; 

對象相反,這代表你的職位準確,我認爲。但是,我仍然感到,當我再次查看你的例子時,這是否意味着Hitbox應該有一個Collidable成員呢?

class Hitbox 
{ 
    Collidable *collision; 
}; 

我有什麼:
一個演員擁有它處理衝突

擊中格應該做的一擊中格:
繼承可碰撞或
有無可碰撞的成員

演員已經下你的約定。 Hitbox應該這樣做嗎?

回答

2

我會做第二種情況,因爲ObjectCollidable是交叉問題。如果你走CollidableObject路線,你可能會最終導致類的組合爆炸。直到你看到一個CollidableTrackableClickableBlowuppableObject不會很長。

因爲Collidable是純虛擬的,所以在這種情況下它被用作接口,所以沒有很多針對多重繼承的批評。你只是簡單地指出一個Actor實現了接口Collidable

+0

如果你是第一次做的話,你不必擁有一個「CollidableTrackableClickableBlowuppableObject」。它只是一個繼承自Collidable,Trackable,Clickable和Blowuppable的類,就像第一種方式一樣,但是你不會像第一種方式那樣繼承Object。我不確定第一個是否更有用;不應該所有的'Clickable's都可以繪製到屏幕上嗎?如果你把它們全部分開,你不能分辨出你的Object是可點擊的還是你的Clickable是可繪製的。第二種方法,你知道'Clickable'是可繪製的。 – 2012-07-17 21:14:26

+1

如果你做了_second_我想說的話,你就不必有...了。 – 2012-07-17 21:42:13

1

這是strategy pattern的完美場景。這就是英語在我們腦海中玩弄技巧的地方,並且讓我們認爲CollidableObject是這個層級中的有效對象。我認爲碰撞更多的是一種行爲而不是一種物體,所以我會選擇兩種都不行。

宗教組成。用於該:

class Object 
{ 
    CollidableBehavior* collisionBehavior; 
} 
class Actor : Object 
{ 
    // collisionBehavior = new ActorCollision() 
} 

class AClassThatDoesntCollide 
{ 
    // collisionBehavior = NULL 
} 
+0

如果碰撞行爲取決於Actor類的細節,這將不太實際。另一方面,如果它是一個獨立的屬性,這是很有道理的。 – 2012-07-17 22:04:40

0

是落實第二個情況下,唯一一點,如果我想獲得從可碰撞 而不對象?

是的,第二種情況給你更多的靈活性,因爲它允許分開接口。例如,稍後您可能需要一個可碰撞的對象,但它不可繪製。

什麼時候有利於第一種情況,因爲第二種情況提供更多的 靈活性。

第二種情況提供了更多的靈活性,但設計也更復雜。最後,你將需要虛擬繼承,這是更難處理。但是,如果您的基類是純粹的抽象類型,它不應該是一個問題。您可能會看到this