Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从另一个类调用一个类的所有子类方法_C#_Inheritance_Methods_Multiple Inheritance - Fatal编程技术网

C# 从另一个类调用一个类的所有子类方法

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()

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

这是可行的,但它只在基类上调用。 应在“Gear”的所有子级中调用“Update”方法: e、 g:


我怎样才能做到这一点?

为了让代码按您想要的方式工作,您需要执行类似的操作(我担心内存泄漏):

然后定义一个集合类:

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