我对继承很新。尝试使用静态计时器实现基类。每次经过时间后,此计时器将调用抽象函数。原因是来自基类的两个类将具有同步的计时器。这是代码
基类:
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()
{
....
}
它只对我继承自基类的两个类中的一个有效(无论哪个类首先实例化它都适用于它)。
由于
答案 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;
}