Использование метода внутри другого метода из метода Main - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь использовать метод внутри другого метода, который относится к разделу Main.Все хорошо, но когда я пытаюсь сделать это динамическим методом, я не могу добраться до метода.но со статикой это нормально.

class Program
    {
        static void Main(string[] args)
        {
            Car c1 = new Car("Person1", 120, 10);
            //string message = OnCarEngineEvent
            c1.RegisterWithCarEngine(new Car.CarEngineHandler(OnCarEngineEvent)); // here I cannot reach the method OnCarEngineEvent
            //c1.RegisterWithCarEngine(new Car.CarEngineHandler(OnCarEngineEvent));  we can use this instead of Car.CarEngineHandler handler1 
            for (int i = 0; i < 10; i++)
            {
                c1.Accelerate(10);
            }
                Console.ReadLine();
        }

        public  void OnCarEngineEvent(string msg)
        {
            Console.WriteLine("Message from Car Object");
            Console.WriteLine("=> {0}", msg);
            Console.WriteLine("*************************");
        }
    }
    class Car
    {
        public int MaxSp { get; set; } 
        public int CurrSp { get; set; }
        public string PetName { get; set; }
        public Car()
        {

        }

        public Car(string petName, int maxSp, int currSp)
        {
            MaxSp = maxSp;
            CurrSp = currSp;
            PetName = petName;

        }

        public bool CarIsDead { get; set; }

        public delegate void CarEngineHandler(string message);

        private CarEngineHandler listOfCarHandlers;

        public void RegisterWithCarEngine (CarEngineHandler messageToMethod)
        {
            listOfCarHandlers = messageToMethod;
        }

        public void Accelerate(int baseSpeed)
        {
            if (CarIsDead)
            {
                if (listOfCarHandlers != null)
                    listOfCarHandlers("Sorry but car is dead");
            }

            else
            {
                CurrSp += baseSpeed;
                if (10 == (MaxSp - CurrSp) && listOfCarHandlers != null)
                {
                    listOfCarHandlers("Careful, you gonna blow!");
                }
                if (CurrSp > MaxSp)
                {
                    CarIsDead = true;
                }
                else Console.WriteLine("Current Speed is {0}", CurrSp);
            }
        }
    }

Если я установлю OnCarEngineEvent как статический, программа будет работать.Но если я наберу его как «public void OnCarEngineEvent (string msg)», то я не смогу добраться до метода в случае вызова делегата.

спасибо.

1 Ответ

0 голосов
/ 17 декабря 2018

Чтобы понять, почему вы не можете передать нестатический метод в качестве параметра RegisterWithCarEngine, необходимо понять разницу между статическими и нестатическими функциями:

  • нестатические функциижить в объекте.Они могут получить доступ ко всем членам этого объекта.Например, Accelerate может использовать MaxSp.Если есть две машины с разными максимальными скоростями, функция будет работать по-разному в зависимости от того, на какой машине вы ее вызываете.

  • Статические функции на одной.Они не являются частью какого-либо объекта (даже если они находятся в классах), поэтому они не могут получить доступ ни к каким членам.Если у вас есть статическая функция в автомобиле, она не может получить доступ к MaxSp, потому что может быть несколько автомобилей с разными скоростями.Статическая функция не будет знать, какой MaxSp выбрать.Статические функции могут, конечно, получать доступ к другим статическим функциям и членам статических объектов.

Так почему вы не можете передать нестатическую функцию в RegisterWithCarEngine?Основной метод является статическим, поэтому вы не находитесь ни в одном экземпляре Программы.Если вы передадите нестатическую функцию в RegisterWithCarEngine, эта нестатическая функция может получить доступ к нестатическим членам программы (даже если их нет).В этом случае компилятор не будет знать, какой экземпляр использования.Таким образом, вы должны пометить вашу функцию как статическую, чтобы сказать компилятору: «Я не буду обращаться к каким-либо нестатическим членам этого класса».

Если вы делали вещи в своем методе main другим методом, которыйнестатический, вы можете передать нестатическую функцию в RegisterWithCarEngine.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...