Приведенный ниже код вызывает переполнение стека. 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.