Почему этот код приводит к переполнению стека c #? - PullRequest
0 голосов
/ 01 декабря 2019

Приведенный ниже код вызывает переполнение стека. DoSomething в B вызывает DoSomething в A. Предполагается, что DoSomething в A вызывает реализацию метода своего X, но он вызывает DoSomething из своего производного класса B. Почему? это ошибка?

namespace Test
{
    class Program
    {
        static void Main()
        {
            B b = new B();
            b.DoSomething();
        }
    }
    interface X
    {
        void DoSomething();
    }
    class A : X
    {
        protected void DoSomething() => ((X)this).DoSomething(); // Making visible to derived classes
        void X.DoSomething() => Console.ReadKey();
    }
    interface Y : X
    {
        void DoSomethingElse();
    }
    class B : A, Y
    {
        public new void DoSomething() => base.DoSomething(); //Making publically visible
        public void DoSomethingElse() { }
    }
}

Кстати, этот код работает нормально (если я не наследую X в Y):

namespace Test
{
    class Program
    {
        static void Main()
        {
            B b = new B();
            b.DoSomething();
        }
    }
    interface X
    {
        void DoSomething();
    }
    class A : X
    {
        protected void DoSomething() => ((X)this).DoSomething(); // Making visible to derived classes
        void X.DoSomething() => Console.ReadKey();
    }
    interface Y
    {
        void DoSomethingElse();
    }
    class B : A, Y
    {
        public new void DoSomething() => base.DoSomething(); //Making publically visible
        public void DoSomethingElse() { }
    }
}

Почему в первом примере DoSomething в B пытаетсяреализовать метод DoSomething X, который уже был реализован A. Если это не ошибка, как я могу помешать классу B сделать это без изменения интерфейса Y. Поскольку я хочу отразить в Y, что он наследует X.

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