0

我有一个名为 CombatMgr 的类,在其中我有几个不同的功能。当这些函数被调用时,我希望继承 CombatMgr 的其他类具有相同的函数,并将在其中调用它。

    //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() 函数。所以几乎就像一个事件 OnCombat 并且所有的侦听器都是继承的子类。

4

5 回答 5

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

你应该使用 RogueCombat 实例,而不是 CombatMgr。</p>

于 2012-05-21T06:16:21.323 回答
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
于 2012-05-21T06:12:02.413 回答
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();
于 2012-05-21T06:49:25.103 回答
0

我不确定我是否正确理解了您要达到的目标。无论如何,您确定 RogueCombat 应该源自 CombatMgr 吗?RogueCombat 从 CombatMgr 继承了什么?只是方法的名称以及它们同时被调用的事实吗?

请记住,类的实例与其派生类的实例根本没有任何关系,因此您必须通过集合或事件在基类中跟踪这些实例。

Alfonso 的代码不起作用,因为它不适用于现有的 RogueCombat 实例,但每次在 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.Current)访问单个 CombatMgr 实例,则不需要这样做。

于 2012-05-21T07:43:02.037 回答
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

于 2012-05-21T06:13:04.200 回答