c#: переопределение Equals для объекта и его приведение вверх - PullRequest
0 голосов
/ 19 июня 2020

Я возился с polymorphisem, и у меня возник странный случай, которого я не понимаю:

У меня есть класс A, который реализует Equals (Object other), и класс B, который наследуется от A и переопределяет equals, Кроме того, у него есть Equals (A other) и Equals (B other), в основной функции Ive сделал 3 объекта, A a, B b и A ab.

код всего этого:

    class A
    {
        public A()
        {
        }

        public override bool Equals(Object other)
        {
            Console.WriteLine("AObject");
            return true;
        }
    };
    class B : A
    {

        public B()
        {
        }

        public override bool Equals(Object other)
        {
            Console.WriteLine("BObject");
            return true;
        }

        public bool Equals(A other)
        {
            Console.WriteLine("BA");
            return true;
        }

        public bool Equals(B other)
        {
            Console.WriteLine("BB");
            return true;
        }
    };

    class Program
    {
        static void Main(string[] args)
        {
            A a1 = new A();
            A ab = new B();
            B b1 = new B();


            if (ab.Equals(a1)) Console.WriteLine(1);
            if (ab.Equals(b1)) Console.WriteLine(1);
            if (ab.Equals(ab)) Console.WriteLine(1);

        }

Всякий раз, когда я запускаю программу, она печатает BObject, что означает, что она вызывает функцию Equals класса B, имеет смысл, но по какой-то причине обрабатывает все другие объекты, которые она получает как параметр, как Object type?

Когда я делаю то же самое, но с намерением сделать это из ab, я делаю это из b1 (т.е. if (b1.Equals(a1)) Console.WriteLine(1);), он отлично работает и печатает BA, так что это кастинг делает его странным, я был бы рад, если бы кто-нибудь мог объяснить мне, почему он вызывает Equals (Другой объект), а не Equals (Другой) или Equals (B другой)

Спасибо!

edit: To Уточните, мой вопрос: почему разные объекты типа A являются nd B обрабатывается как они из объекта типа в функции Equal.

Я понимаю, что A ab = new B(); делает, я просто не понимаю, почему он использует Equal(Obejact other), а не Equal(A other)

1 Ответ

1 голос
/ 19 июня 2020

Помните, что компилятор сначала привяжется к соответствующему методу с учетом типов времени компиляции, а затем любые применимые переопределения (не перегрузки) применяются во время выполнения.

Все вызовы привязаны к A.Equals(object) поскольку это тип переменной ab во время компиляции. Затем все они заменяются на B.Equals(object) во время выполнения, поскольку это среда выполнения тип ab.

Диспетчер времени выполнения не будет смотреть на фактический тип ab и фактический тип параметра и определите, что существует другой перегруженный метод, который лучше соответствует аргументам - все, что он может сделать, это искать любые переопределения (из которых есть только one) и отправьте к нему.

Чтобы выполнить привязку к перегрузкам в B, которые имеют разные типы параметров, вам необходимо выполнить привязку к ним во время компиляции, что вот почему b1.Equals(a1) вызывает B.Equals(A), поскольку тип времени компиляции b1 равен B, и есть перегрузка, которая принимает A.

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