2012-05-21 177 views
0

我有一個名爲CombatMgr的類,裏面有我幾個不同的功能。當這些函數被調用時,我希望繼承CombatMgr的其他類具有相同的功能,並且會在其中調用它。c#繼承類

//Main class 
    public class CombatMgr 
    { 
     public void EnterCombat() 
     { 
      //This gets called as CombatMgr.EnterCombat(); 
     } 
    } 

    //Side class 
    public class RogueCombat : CombatMgr 
    { 
     public void EnterCombat() 
     { 
      //I want this function to be 
      //linked to the EnterCombat function from CombatMgr. 
      //And called when the main function is called. 
     } 
    } 

我需要的代碼,這樣的工作...當我打電話CombatMgr.EnterCombat()是活躍需求的所有子類解僱他們EnterCombat()函數。所以幾乎就像一個Event OnCombat,所有的監聽器都是繼承的子類。

+0

我希望項目幾乎像一個事件。我有幾個類都繼承了主CombatMgr。我使用CombatMgr來調用EnterCombat(),LeaveCombat()等函數。所以,如果我做到了...... CombatMgr Combat = new Combat(); Combat.RogueCombat _RogueCombat = new Combat.RogueCombat() Combat.EnterCombat(); //我如何獲得RogueCombat的EnterCombat函數來觸發主EnterCombat這樣使用? – user1127093

+0

請參閱我已更新答案。 – Waqar

回答

2

你需要讓你的基類方法,如虛擬和子類

//Main class 
public class CombatMgr 
{ 
    public virtual void EnterCombat() 
    { 
     //This gets called as CombatMgr.EnterCombat(); 
    } 
} 

//Side class 
public class RogueCombat : CombatMgr 
{ 
    public override void EnterCombat() 
    { 
     //I want this function to be 
     //linked to the EnterCombat function from CombatMgr. 
     //And called when the main function is called. 
    } 
} 

覆蓋它作爲你要像行爲事件問題的註釋部分說。然後,你可以做以下

//Main class 
public class CombatMgr 
{ 
    public void EnterCombat() 
    { 
     // write logic here you want to execute for every child instance. 
     // then call the virtual protected method. 
     this.OnEnterCombat(); 
    } 

    protected virtual void OnEnterCombat() { } 
} 

//Side class 
public class RogueCombat : CombatMgr 
{ 
    protected override void OnEnterCombat() 
    { 
     // Write logic for child class here 
    } 
} 

也請不遵守

CombatMgr cb1 = new RogueCombat(); 
     CombatMgr cb2 = new RogueCombat(); 

     cb1.EnterCombat(); // calling this will also call the OnEnterCombat() method for intance cb1 not for cb2 
+0

從override中(在RogueCombat中),你也可以調用「base.EnterCombat()」,它將執行基類CombatMgr的原始EnterCombat()。 – Serge

+0

剛剛嘗試過。我對代表並不是很熟悉,但是閱讀也許這就是我想要的,因此當我調用EnterCombat()時,它會調用所有活動的子類OnEnterCombat。 – user1127093

+0

其實事件是不同的。任何類都可以註冊事件,它不需要作爲子類來註冊基類事件。在這個例子中,調用基類的OnEntercombat將調用子類的OnEntercombat,如果它覆蓋它,則會調用基類OnEntercombat。 – Waqar

0

你應該標記功能虛擬基類,並重寫的繼承類:

//Main class 
public class CombatMgr 
{ 
    public virtual void EnterCombat() 
    { 
     //This gets called as CombatMgr.EnterCombat(); 
    } 
} 

//Side class 
public class RogueCombat : CombatMgr 
{ 
    public override void EnterCombat() 
    { 
     //I want this function to be 
     //linked to the EnterCombat function from CombatMgr. 
     //And called when the main function is called. 
    } 
} 

看更多於:http://msdn.microsoft.com/en-us/library/9fkccyh4.aspx

3
//Side class 
public class RogueCombat : CombatMgr 
{ 
    public override void EnterCombat() 
    { 
     base.EnterCombat(); 
     //.... 
    } 
} 

你應該使用RogueCombat實例,而不是CombatMgr

1

也許我錯了,但我認爲你想要做的是以下,假設「主要功能」是在CombatMgr類,這使得感覺是一個「主要功能」,故名...

public class CombatMgr 
{ 
    // Delegate and Event 
    public delegate void Combat(); 
    public event Combat OnEnterCombat; 

    // Your main function 
    public void EnterCombat() 
    { 
     // Calling event, and all subscribers to it 
     if (OnEnterCombat != null) 
     { 
      OnEnterCombat(); 
     } 
    } 
} 

// Side Class 1 
public class RogueCombat : CombatMgr 
{ 
    public void EnterCombat() 
    { 
     Console.WriteLine("Rogue Combats"); 
    } 
} 

然後你會使用這樣的:

CombatMgr manager = new CombatMgr(); 

// Suscribing a Rogue combat 
manager.OnEnterCombat +=() => 
{ 
    RogueCombat rogue = new RogueCombat(); 
    rogue.EnterCombat(); 
}; 

manager.EnterCombat(); 
+0

剛剛修改我的代碼來嘗試這個沒有工作,我怎麼想。 Combat.CombatMgr Cmb = new Combat.CombatMgr(); Combat.Rogue.RogueCombat PrCmb = new Combat.Rogue.RogueCombat(); Cmb.EnterCombat();. 當主CombatMgr.EnterCombat();被稱爲我想要繼承主CombatMgr的任何子類都有自己的EnterCombat函數被調用。 – user1127093

+0

我想我現在明白了,你會想看看「觀察者模式」 - http://www.dofactory.com/Patterns/PatternObserver.aspx - 讓我用一個簡單的非生產代碼樣本修改代碼它 –

+0

我只是修改了使用事件的代碼。看看是否適合你的需求:) –

0

我真的不知道我理解正確你是什麼試圖實現。無論如何,你確定RogueCombat應該來自CombatMgr嗎? RogueCombat從CombatMgr繼承了什麼?只是方法的名稱和他們同時被調用的事實?

請記住,一個類的實例與它的派生類的實例根本沒有任何關係,所以你必須跟蹤這些實例在你的基類中,並帶有一個集合或一個事件。

Alfonso的代碼不起作用,因爲它不適用於RogueCombat的exixting實例,但每次在CombatMgr中調用EnterCombat時都會創建一個新代碼。爲了讓它工作,只要創建它們,就應該將派生類的實例註冊到基類中的事件中。你可以在這樣的構造做到這一點:

public class RogueCombat : CombatMgr 
{ 
    public RogueCombat(CombatMgr aMgr) 
    { 
     aMgr.OnEnterCombat += new Combat(EnterCombat); 
    } 

    public void EnterCombat() 
    { 
     Console.WriteLine("Rogue Combats"); 
    } 
} 

對於這個工作,你必須通過你創建RogueCombat實例CombatMgr每次的實例。如果您的系統中的每個點都可以訪問CombatMgr的單個實例(如CombatMgr.Current),則這不是必需的。