抽象函数和计时器

时间:2017-05-16 15:48:01

标签: c# inheritance

我对继承很新。尝试使用静态计时器实现基类。每次经过时间后,此计时器将调用抽象函数。原因是来自基类的两个类将具有同步的计时器。这是代码

基类:

 public abstract class UIControllers
{
    public enum IndicatorColors
    {
        Green,
        Red,
        Yellow,
        Blue
    }

    private static Timer UITimer;

    public UIControllers()
    {
        EnableUITimer();
    }

    private int intervalInMillis = 500;

    /// <summary>
    /// Enables the timer responsible for UI effect in the GUI. 
    /// </summary>
    private void EnableUITimer()
    {
        if (UITimer != null)
        {
            return;                
        }

        UITimer = new Timer();
        UITimer.Interval = intervalInMillis;
        UITimer.Elapsed += UITimer_Elapsed;
        UITimer.Start();
    }

    private void UITimer_Elapsed(object sender, ElapsedEventArgs e)
    {
        TimeElapsed();
    }

    /// <summary>
    /// The function is being called when the time interval ellapsed
    /// </summary>
    protected abstract void TimeElapsed();

...

派生类:

    protected override void TimeElapsed()
    {
     ....
    }

它只对我继承自基类的两个类中的一个有效(无论哪个类首先实例化它都适用于它)。

由于

2 个答案:

答案 0 :(得分:1)

EnableUITimer()中,如果已创建静态实例,则会挥手,因此唯一可以为UITimer提供事件处理程序的子类实例是创建它的那个 - 第一个,你注意到了。事件处理程序是一个实例方法,一个委托。

相反,这样做:

private void EnableUITimer()
{
    if (UITimer != null)
    {
        //  If it already exists, give it a handler from this instance. 
        //  Every instance that wants to be notified has to provide its own 
        //  event handler. 
        UITimer.Elapsed += UITimer_Elapsed;
        return;
    }

    UITimer = new Timer();
    UITimer.Interval = intervalInMillis;
    UITimer.Elapsed += UITimer_Elapsed;
    UITimer.Start();
}

答案 1 :(得分:0)

此部分代码运行2次(每个对象实例一次)

    public UIControllers()
    {
        EnableUITimer();
    }

UITimer是静态的,并且在第一次执行时为null,因此所有EnableUITimers都在FIRST实例上执行。使用第二个实例UITimer!= null为true,因此EnableUITimer返回时不会创建计时器并连接UITImer_Elasped。

private void EnableUITimer()
{
    if (UITimer != null)
    {
        return; // Exits on second instance
    }

您可能想要做的是跳过创建计时器(如果已经实例化),但仍然连接到Elapsed事件

private void EnableUITimer()
{
    if (UITimer == null)
    {
        UITimer = new Timer();
        UITimer.Interval = intervalInMillis;
        UITimer.Start();
    }
    UITimer.Elapsed += UITimer_Elapsed;        
}