【问题标题】:Call ALL children methods of a class from another class [closed]从另一个类调用一个类的所有子方法[关闭]
【发布时间】:2017-08-15 01:39:23
【问题描述】:

假设我有一个“Timer”类,它每 1 秒调用一次方法,它调用“Gear”类中的另一个方法:

public class Timer
{
    public void OnTick()
    {
        Gear.Update();
    }
}

public class Gear
{
    public static void Update() { }
}

这有点工作,但它只在基类上调用。 应该在“Gear”的所有子项中调用“Update”方法: 例如:

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 }
}

我该怎么做?

【问题讨论】:

  • 所以你想调用Gear所有子类的所有实例?听起来您想在某种容器中运行代码。
  • 在集合中处理对象引用,然后遍历它们并调用 Update()
  • 你的代码没有意义。你调用Gear.Update() 就像一个静态方法,但是将它定义为一个实例方法。
  • 这是我的问题。我必须在没有实例的情况下调用它,我不知道如何:/
  • 不知道更大的图景是什么,但肯定有更好的方法。试着退后一步,从更高的层次问一个关于你真正想要什么的问题,因为对上述问题的任何回答都会导致麻烦。

标签: c# inheritance methods multiple-inheritance


【解决方案1】:

为了让代码按照你想要的方式工作,你需要做这样的事情(我会担心内存泄漏):

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);            
}

【讨论】:

  • 虽然合理,但我看不出这段代码如何满足“我必须在没有实例化的情况下调用它”(我完全不知道实际的限制是什么,但这篇文章的代码肯定需要实例化对象)。您可能希望与 OP 一起澄清问题,以便实际回答问题。
  • 伟大的黑客! “可能”是轻描淡写的。
猜你喜欢
  • 2019-07-25
  • 2014-02-07
  • 2014-03-15
  • 1970-01-01
  • 2016-10-12
  • 1970-01-01
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多