为什么在C#中允许基类实现接口协定而不继承它?

问题描述 投票:18回答:3

我偶然发现了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

此魔力背后的原因是什么?

恕我直言:此“准实现”功能非常不直观,使代码检查更加困难。您怎么看?

c# interface base-class
3个回答
34
投票

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

//请注意,Derived确实提供了[iContract]的实现

当然可以。遵循逻辑。

    派生需要提供与IContract的每个成员相对应的公共成员。
  • 基类的所有可继承成员也是派生类的成员;这是继承的[[definition
  • 因此,Derived提供了IContract的实现;其继承的成员是满足要求的成员
  • 因此,没有错误。
  • 此功能非常不直观,使代码检查变得更加困难。您怎么看?
我认为,如果您不喜欢该功能,则不应使用它。如果您发现使用此功能的代码令人困惑和奇怪,请鼓励使用此功能的同事停止这样做。

此功能与从派生类使用基类方法的其他任何功能有何不同?在派生类中可以使用或提及来自基类的方法的多种不同方式-方法调用,重写,方法组转换等。

此外,相对而言,这是一个简单直接的案例。如果您真的想抱怨C#中的接口语义混乱,我会花时间抱怨

接口重新实现语义

。那真的是在烤人们的面条。我总是必须在规范中查找该内容,以确保我正确理解了语义。

12
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.