有没有更好的方法可以从另一个班级获取信息?

时间:2019-01-29 11:33:34

标签: c# .net

我正在研究一个程序,我想知道从一堂课到另一堂课获取信息的最佳方法。

我的目的是从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类就像一个计时器:停止,启动和运行。每间隔一个“滴答声”。

2 个答案:

答案 0 :(得分:4)

通常,您可以通过建立“方向”来解决此类问题。例如。在这里,应该“从” Program“到” MyTimer是很自然的。在给定的方向上,直接进行方法调用,访问属性等都很好。

当您需要信息流向另一个方向时,即使用eventsMyTimer引发一个事件,Program可以有一个处理程序。这样,MyTimer甚至不知道哪个类正在创建/使用它,甚至不知道已经安装了多少个事件处理程序

答案 1 :(得分:0)

在这种情况下,我认为Damien非常重视。 但是,我想提出一个替代方案:使用共享的状态对象。

您可以定义一个State类,该类除了保留滴答计数的值外没有其他用途。

您可以在Program中实例化它,并将其传递给MyTimer。请注意,两个类现在共享同一实例(如果在多线程上下文中,可能会引入线程/并发问题)。

MyTimer然后将更新该共享对象上的状态。

示例是MVVM / WPF中的Model / ViewModel类,您可以在其中将某些Control的属性绑定到该对象的属性。

请注意,Program不会立即知道发生的更改。因此,这将不得不额外处理。再次通过事件,某些“观察员模式”或类似的事件。

正如我所说的,事件是进入这里的方式,但是我认为建议另一种类间交流方式并没有什么坏处。