为什么C#中的基类允许实现接口契约而不inheritance它?

我偶然发现了C#的这个“特性” – 实现接口方法的基类不必从中派生出来

例:

public interface IContract { void Func(); } // Note that Base does **not** derive from IContract public abstract class Base { public void Func() { Console.WriteLine("Base.Func"); } } // Note that Derived does *not* provide implementation for IContract public class Derived : Base, IContract { } 

会发生什么是Derived神奇地选择一个公共方法Base.Func ,并决定它将实现IContract.Func

这种魔力背后的原因是什么?

恕我直言:这种“准实现”function非常不直观,使代码检查更加困难。 你怎么看?

原因是你的评论完全不正确:

//请注意,Derived不提供IContract的实现

当然可以。 遵循逻辑。

  • Derived需要提供与IContract的每个成员相对应的公共成员。
  • 基类的所有可inheritance成员也是派生类的成员; 这是inheritance的定义
  • 因此Derived为IContract提供了一个实现; 其inheritance的成员是满足要求的成员
  • 因此,没有错误。

此function非常不直观,使代码检查更加困难。 你怎么看?

如果您不喜欢,我认为您不应该使用该function。 如果您发现使用此function的代码令人困惑和奇怪,那么请鼓励使用此function的同事停止这样做。

此function与派生类中使用基类的方法的任何其他function有何不同? 在派生类中可以使用或提及基类中的方法有许多不同的方法 – 方法调用,覆盖,方法组转换等。

此外,相对而言,这是一个简单,直接的案例。 如果你真的想抱怨在C#中混淆界面语义,我会花时间抱怨界面重新实现语义 。 那个真的好像烤人的面条。 我总是要在规范中看一下这个东西,以确保我的语义正确。

为什么你认为这很奇怪而且不自然? 基类的每个公共成员也是派生类的公共成员。 所以这里没有矛盾。 无论如何,如果你愿意,你可以明确地实现接口。