C# 继承的类

本文关键字:继承 | 更新日期: 2023-09-27 18:34:41

我有一个名为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(( 函数。所以几乎就像一个事件战斗,所有的侦听器都是继承的子类。

C# 继承的类

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

你应该使用 RogueCombat 实例,而不是 CombatMgr。

您需要将基类方法设置为虚拟并在子类中重写它

//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

也许我弄错了,但我认为您要做的是以下内容,假设"主要功能"是 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();
您应该

在基类上将函数标记为虚拟,并在继承的类上重写:

//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

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

请记住,类的实例

与其派生类的实例没有任何关系,因此您必须使用集合或事件跟踪基类中的这些实例。

Alfonso的代码不起作用,因为它不适用于RogueCombat的exixing实例,但是每次在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(,则不需要这样做。