C# 从另一个类调用一个类的所有子类方法
假设我有一个“Timer”类,它有一个每1秒调用一次的方法,它调用类“Gear”中的另一个方法: 这是可行的,但它只在基类上调用。 应在“Gear”的所有子级中调用“Update”方法: e、 g:C# 从另一个类调用一个类的所有子类方法,c#,inheritance,methods,multiple-inheritance,C#,Inheritance,Methods,Multiple Inheritance,假设我有一个“Timer”类,它有一个每1秒调用一次的方法,它调用类“Gear”中的另一个方法: 这是可行的,但它只在基类上调用。 应在“Gear”的所有子级中调用“Update”方法: e、 g: 我怎样才能做到这一点?为了让代码按您想要的方式工作,您需要执行类似的操作(我担心内存泄漏): 然后定义一个集合类: public sealed class GearCollection : List<Gear> { public void Update()
我怎样才能做到这一点?为了让代码按您想要的方式工作,您需要执行类似的操作(我担心内存泄漏): 然后定义一个集合类:
public sealed class GearCollection : List<Gear>
{
public void Update()
{
foreach (var gear in this)
gear.Update();
}
}
为了让代码按您想要的方式工作,您需要执行以下操作(我担心内存泄漏): 然后定义一个集合类:
public sealed class GearCollection : List<Gear>
{
public void Update()
{
foreach (var gear in this)
gear.Update();
}
}
所以你想调用Gear所有子类的所有实例?听起来你想在某种容器中运行你的代码。在一个集合中引用一个对象,然后遍历它们并调用Update(),你的代码没有意义。像静态方法一样调用
Gear.Update()
,但将其定义为实例方法。这是我的问题。我不得不称之为没有实例,我不知道如何:/不知道这里的大局是什么,但肯定有更好的方法。试着退一步,从更高的层次上问一个关于你真正想要什么的问题,因为以上问题的任何答案都会带来麻烦。那么你想调用Gear所有子类的所有实例吗?听起来你想在某种容器中运行你的代码。在一个集合中引用一个对象,然后遍历它们并调用Update(),你的代码没有意义。像静态方法一样调用Gear.Update()
,但将其定义为实例方法。这是我的问题。我不得不称之为没有实例,我不知道如何:/不知道这里的大局是什么,但肯定有更好的方法。试着退一步,从更高的层次上问一个关于你真正想要什么的问题,因为对上述问题的任何回答都会带来麻烦。虽然合理,但我看不出这段代码如何满足“我必须调用它而不实例化”(我完全不知道实际的限制是什么,但编写代码这篇文章肯定需要实例化对象)。你可能想用OP来澄清问题,所以答案会回答它。伟大的黑客!“可能”是一个保守的说法。虽然是合理的,但我不明白这段代码如何满足“我必须在不实例化的情况下调用它”(我完全不知道实际的限制是什么,但编写代码这篇文章肯定需要实例化对象)。你们可能想和OP一起澄清这个问题,所以答案就是答案。伟大的黑客!“可能”是一种轻描淡写的说法。
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);
}