.NET 4.x Делегаты - C#

Узнай цену своей работы

Формулировка задачи:

Помогите разобраться: 1. Почему не выводит время на экран? это пример из учебника (Learn C# 3.0 O'REILLY Jesse Liberty, p.390), скопипастил вроде правильно - все перепроверил. 2. Зачем автор в сигнатуре делегата и в методах (TimeHasChanged, WriteLogEntry) указывает в качестве входного параметра object theClock (в указанных функциях он не используется и в метод Subcribe передается отдельно)? 3. Почему он указывает тип object, а не - Clock? 4. Без вышеуказанного входного параметра код будет работать?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
 
namespace ClockDelegate
{
    public class TimeInfoEventArgs: EventArgs
    {
        public int hour;
        public int minute;
        public int second;
 
        public TimeInfoEventArgs(int hour, int minute, int second)
        {
            this.hour = hour;
            this.minute = minute;
            this.second = second;
        }
    }
    public class Clock
    {
        private int hour;
        private int minute;
        private int second;
 
        public delegate void SecondChangeHandler(object clock, TimeInfoEventArgs timeInformation);
 
        public SecondChangeHandler SecondChanged;
 
        public void Run()
        {
            for (;;)
            {
                Thread.Sleep(100);
                System.DateTime dt = new System.DateTime();
                if (dt.Second != second)
                {
                    TimeInfoEventArgs timeInformation = new TimeInfoEventArgs(dt.Hour, dt.Minute, dt.Second);
                    if (SecondChanged != null) { SecondChanged(this, timeInformation); }
                }
                this.hour = dt.Hour;
                this.minute = dt.Minute;
                this.second = dt.Second;
            }
        }
    }
    public class DisplayClock
    {
        public void TimeHasChanged(object theClock, TimeInfoEventArgs ti)
        {
            Console.WriteLine("Current time: \t{0}:{1}:{2}", ti.hour.ToString(), ti.minute.ToString(), ti.second.ToString());
        }
 
        public void Subscribe(Clock theClock)
        {
            theClock.SecondChanged += new Clock.SecondChangeHandler(TimeHasChanged);
        }
    }
    public class LogCurrentTime
    {
        public void WriteLogEntry(object theClock, TimeInfoEventArgs ti)
        {
            Console.WriteLine("Logging to file: {0}:{1}:{2}", ti.hour.ToString(), ti.minute.ToString(), ti.second.ToString());
        }
 
        public void Subscribe(Clock theClock)
        {
            theClock.SecondChanged += new Clock.SecondChangeHandler(WriteLogEntry);
        }
    }
    public class Tester
    {
        public void Run()
        {
            Clock theClock = new Clock();
 
            DisplayClock dc = new DisplayClock();
            dc.Subscribe(theClock);
 
            LogCurrentTime lct = new LogCurrentTime();
            lct.Subscribe(theClock);
 
            theClock.Run();
        }
 
    }
    class Program
    {
        static void Main(string[] args)
        {
            Tester t = new Tester();
            t.Run();
        }
    }
}

Решение задачи: «.NET 4.x Делегаты»

textual
Листинг программы
System.DateTime dt = System.DateTime.Now;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.3 из 5
Похожие ответы