从另一个调用类
问题描述:
一类的所有儿童的方法,您说,我有一个,每1秒调用的方法是“定时”级,并呼吁在类“齿轮”的另一种方法:从另一个调用类
public class Timer
{
public void OnTick()
{
Gear.Update();
}
}
public class Gear
{
public static void Update() { }
}
这种工作,但它只在基类上调用。 方法“更新”应该被称为“齿轮”的所有儿童: e.g:
public class AnotherClass : Gear
{
public override void Update() { // do stuff }
}
public class YetAnotherClass : Gear
{
public override void Update() { // do stuff }
}
public class AndAnotherClass : Gear
{
public override void Update() { // do stuff }
}
我怎样才能做到这一点?
答
为了使代码工作,你想要的方式,你需要做这样的事情(我会担心内存泄漏):
public abstract class Gear
{
readonly static List<Gear> gears = new List<Gear>();
public Gear()
{
gears.Add(this);
}
public static void Update()
{
foreach (var gear in gears)
gear._Update();
}
protected abstract void _Update();
}
public sealed class Gear1 : Gear
{
protected override void _Update()
{
//do stuff
}
}
public sealed class Gear2 : Gear
{
protected override void _Update()
{
//do stuff
}
}
public sealed class Gear3 : Gear
{
protected override void _Update()
{
//do stuff
}
}
public static void Main(string[] args)
{
var timer =
new Timer(o => Gear.Update(), null, 0, SOME_INTERVAL);
}
但是,您可能是更好断通过如此限定基础案例:
public abstract class Gear
{
public abstract void Update();
}
,然后定义一个集合类:
public sealed class GearCollection : List<Gear>
{
public void Update()
{
foreach (var gear in this)
gear.Update();
}
}
然后
public static void Main(string[] args)
{
var gears = new GearCollection();
//add gear instancs to gears
var timer = new Timer(o => gears.Update(), null, 0, SOME_INTERVAL);
}
+0
虽然是合理的,但我不明白这段代码如何满足“我必须在没有实例化的情况下调用它”(我完全不知道实际的限制是什么,但是编写它的这篇文章肯定需要实例化对象)。您可能希望与OP一起澄清问题,以便实际回答。 –
+0
很好的破解! “*可能*”是轻描淡写。 –
所以你要拨打齿轮的所有子类的所有实例?听起来就像你想在某种容器中运行你的代码。 –
集合中的痛处对象引用,然后遍历它们并调用Update() – OldProgrammer
您的代码没有意义。您可以像调用静态方法一样调用Gear.Update(),但将其定义为实例方法。 –