Czy w tym przypadku jest sens używania delegata ?

0

Tak jak w temacie, nie lepiej byłoby po prostu zdefiniować jedno metodę i do niej przesyłać te stringi świadczące o aktualnym stanie silnika samochodu ?

namespace Test
{
    class Car
    {
        public int CurrentSpeed { get; set; }
        public int MaxSpeed { get; set; }
        public string PetName { get; set; }

        private bool carIsDead;

        public Car() { MaxSpeed = 100; }
        public Car(string name, int maxSp, int currSp)
        {
            CurrentSpeed = currSp;
            MaxSpeed = maxSp;
            PetName = name;
        }

        // 1) definiujemy delegata
        public delegate void CarEngineHandler(string msgForCaller);

        // 2) definiujemy zmienną składową tego delegata
        private CarEngineHandler listofHandlers;

        public void RegisterWithCarEngine(CarEngineHandler methodToCall)
        {
            listofHandlers = methodToCall;
        }

        public void Accelerate(int delta)
        {
            if (carIsDead)
            {
                if (listofHandlers != null)
                {
                    listofHandlers("Sorry, this car is dead....");
                }
            }
            else
            {
                CurrentSpeed += delta;
                if (10 == (MaxSpeed - CurrentSpeed) && listofHandlers != null)
                {
                    listofHandlers("Careful buddy! Gonna blow!");
                }

                if (CurrentSpeed >= MaxSpeed)
                {
                    carIsDead = true;
                }
                else
                    Console.WriteLine("CurrentSpeed = {0}", CurrentSpeed);
            }
        }

        public static void OnCarEngineEvent(string msg)
        {
            Console.WriteLine("\n***** Message From Car Object *****");
            Console.WriteLine("=> {0}", msg);
            Console.WriteLine("**************************************\n");
        }

        static void Main(string[] args)
        {
            Car c1 = new Car("SlugBug", 100, 10);
            c1.RegisterWithCarEngine(new Car.CarEngineHandler(OnCarEngineEvent));

            // przyspieszay (aby wyzwolic zdarzenia)
            Console.WriteLine("***** Speeding up ******");
            for (int i = 0; i < 6; ++i)
            {
                c1.Accelerate(20);
            }
            Console.ReadLine();
            Console.ReadKey();
        }

            // to jest cel wchodzacych zdarzen
        }
}
0

Dobrym rozwiązaniem byłby tu event

0

Coś tu jest nie tak. Masz CarEngineHandler nazwany jako LIST of handlers. A tak naprawdę siedzi tam tylko jedna metoda. Gdyby to był event, to wtedy by się zgadzało, bo event to wzorzec Obserwator. Jak odpalasz event, to wysyłasz go do wszystkich obiektów, które się podłączyły.

1 użytkowników online, w tym zalogowanych: 0, gości: 1