c#继承的类

时间:2012-05-21 06:09:33

标签: c# inheritance

我有一个名为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()函数。所以几乎就像一个Event OnCombat,所有的监听器都是继承的子类。

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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

答案 2 :(得分: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();

答案 3 :(得分: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

答案 4 :(得分:0)

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

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

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),则不需要这样做。