我正在研究一个程序,我想知道从一堂课到另一堂课获取信息的最佳方法。
我的目的是从MyTimer到Program类,以获取有关计时器执行多少“滴答声”的信息。
**我不希望MyTimer类依赖于Program类(例如,通过使用Program.SetUpdate())。 MyTimer类应与每个类一起使用,而无需更改其代码。
我已经尝试使用公共静态方法发送信息。
class Program
{
private static int _count;
private static MyTimer _myTimer;
static void Main(string[] args)
{
_count = 0;
_myTimer = new MyTimer() { Timer_Interval = 100 };
_myTimer.Start();
do
{
Console.WriteLine("Press q to quit.");
} while (Console.ReadKey().KeyChar.ToString().ToLower() != "q");
_myTimer.Stop();
}
public static void SetUpdate(int count)
{
_count = count;
Print();
}
private static void Print()
{
Console.WriteLine(_count);
}
}
class MyTimer
{
private Timer _timer;
private int _ticks;
public int Timer_Interval { get; set; }
public MyTimer()
{
_timer = new Timer();
_timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed);
}
private void _timer_Elapsed(object sender, ElapsedEventArgs e)
{
Program.SetUpdate(_ticks);
_ticks++;
}
public void Start()
{
if (Timer_Interval == 0)
throw new InvalidOperationException("_timer interval can not be 0.");
_ticks = 0;
_timer.Interval = Timer_Interval;
_timer.Start();
}
public void Stop()
{
_timer.Stop();
}
}
输出为1,2,3 ...,直到按q / Q
我尽力做到这一点只是为了向您展示这个概念。
因此,我创建了一个名为Program的类,该类调用MyTimer类。 MyTimer类就像一个计时器:停止,启动和运行。每间隔一个“滴答声”。
答案 0 :(得分:4)
通常,您可以通过建立“方向”来解决此类问题。例如。在这里,应该“从” Program
“到” MyTimer
是很自然的。在给定的方向上,直接进行方法调用,访问属性等都很好。
当您需要信息流向另一个方向时,即使用events。 MyTimer
引发一个事件,Program
可以有一个处理程序。这样,MyTimer
甚至不知道哪个类正在创建/使用它,甚至不知道已经安装了多少个事件处理程序。
答案 1 :(得分:0)
在这种情况下,我认为Damien非常重视。 但是,我想提出一个替代方案:使用共享的状态对象。
您可以定义一个State
类,该类除了保留滴答计数的值外没有其他用途。
您可以在Program
中实例化它,并将其传递给MyTimer
。请注意,两个类现在共享同一实例(如果在多线程上下文中,可能会引入线程/并发问题)。
MyTimer
然后将更新该共享对象上的状态。
示例是MVVM / WPF中的Model / ViewModel类,您可以在其中将某些Control的属性绑定到该对象的属性。
请注意,Program
不会立即知道发生的更改。因此,这将不得不额外处理。再次通过事件,某些“观察员模式”或类似的事件。
正如我所说的,事件是进入这里的方式,但是我认为建议另一种类间交流方式并没有什么坏处。