2017-08-15 117 views
0

一类的所有儿童的方法,您说,我有一个,每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 } 
} 

我怎样才能做到这一点?

+0

所以你要拨打齿轮的所有子类的所有实例?听起来就像你想在某种容器中运行你的代码。 –

+1

集合中的痛处对象引用,然后遍历它们并调用Update() – OldProgrammer

+2

您的代码没有意义。您可以像调用静态方法一样调用Gear.Update(),但将其定义为实例方法。 –

回答

3

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

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

很好的破解! “*可能*”是轻描淡写。 –