2012-05-21 152 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),则这不是必需的。