我有一个名为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,所有的监听器都是继承的子类。
答案 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.
}
}
答案 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),则不需要这样做。