不知道條件函數的更多細節,您有兩個選項。
一,你可以這樣做
if (f.GetType() == typeof(FireBall))
{
fireBall = (FireBall)f;
fireBall.FireTheFireBall();
}
else if (f.GetType() == typeof(Heal))
...
或者,你的能力能有一個抽象的激活方法,它要求所有派生類重載:
class Fireball
{
public override void Activate()
{
//do fireball specific things
this.FireTheFireBall();
}
public void FireTheFireBall() {...}
}
class Heal
{
public override void Activate()
{
//do healing specific things
this.ApplyTheBandage();
}
...
}
abstract class Ability
{
public abstract void Activate();
}
void condition(Ability f){
f.Activate(); //runs the version of Activate of the derived class
}
那麼這適用於任何事情用Ability可以調用someAbility.Activate()並且派生類提供的實現將被執行。
你也應該研究一下接口,它們就像抽象類一樣。接口的好處是你可以實現多個接口,而你僅限於從一個基本的抽象類繼承。想想一個具有轉向和拉動功能的IKnob接口。你可能有一個Drawer類,它實現了IKnob,一個Door類,一個TrappedDoor類,它實現了Turn並激活了一個陷阱。一個球員走過來一個門,擊中它使用按鈕,你傳遞給open函數的對象,打開(IKnob旋鈕)
void Open(IKnob knob)
{
knob.Turn();
knob.Pull();
}
class TrappedDoor:IKnob,IMaterial,ISomethingElse,IHaveTheseOtherCapabilitiesAsWell
{
private bool TrapAlreadySprung{get;set;}
//more complex properties would allow traps to be attached either to the knob, or the door, such that in one case turning the knob activates the trap, and in the other, Pull activates the trap
public Turn() {
if(! TrapAlreadySprung)
{
MessageBox("You hit your head, now you're dead");
}
}
}
有方法來檢查,如果事情有一個接口,因此,如果有些玩家走到一個物品上,試圖與之交談,你可以檢查物體是否具有ICanTalk接口,如果它確實接着調用object.GetReply(「Hello」)並且物體可以響應。所以,如果你願意的話,你可以談論門和石頭。您可以使用ICanTalk接口方法處理所有處理對話/顯示響應等問題的代碼,然後其他類可以實現ICanTalk,並且每個類都可以決定如何響應。這個概念被稱爲「分離問題」,並幫助您創建更多可重用的代碼。
重要的是你可以編寫一段代碼,一個算法,函數等,只能用於該接口,這樣一旦你得到代碼與接口一起工作,你就可以使用該接口任何類,並且該類可以利用預先存在的代碼。
I.e.你的condition
函數,如果它接受了IAbility接口,那麼一旦你的代碼有效,那麼你創建的實現了IAbility的任何類都可以傳遞給條件函數。條件函數負責做任何它應該做的事情,而實現IAbility的類負責處理它實現的方法中的任何特定的內容。
當然,實現抽象類或接口的類必須實現所需的方法,所以有時候你可能會覺得你正在複製代碼。例如,如果您有類似TrappedDoor和Door的類,則TrappedDoor的行爲可能與普通Door類似,如果陷阱未設置/已經彈出。所以你可以在這種情況下繼承門,或者有一個私人的門屬性(稱爲「組合」)。如果陷阱已經彈出,那麼您可以調用基本Door類或私人Door屬性並調用.Turn,以便在陷阱未激活的情況下重新使用常規門的默認行爲。
Test if object implements interface
我個人主要使用的接口和組成,而不是繼承。不是那種可怕的繼承,但是繼承層次很快會變得非常複雜。
經典的OOP多態/繼承問題:)想想一個解決方案既困難又有趣,它可以保持封裝並且具有舒適性。 +1。 – dreamzor
這與Objective C有什麼關係? –
對不起,我想我標記錯了。 –