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(( 函数。所以几乎就像一个事件战斗,所有的侦听器都是继承的子类。
//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(,则不需要这样做。