我偶然发现了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
。
此魔力背后的原因是什么?
恕我直言:此“准实现”功能非常不直观,使代码检查更加困难。您怎么看?
原因是您的评论完全不正确:
//请注意,Derived确实提供了[iContract]的实现
当然可以。遵循逻辑。
我认为,如果您不喜欢该功能,则不应使用它。如果您发现使用此功能的代码令人困惑和奇怪,请鼓励使用此功能的同事停止这样做。
此功能与从派生类使用基类方法的其他任何功能有何不同?在派生类中可以使用或提及来自基类的方法的多种不同方式-方法调用,重写,方法组转换等。
此外,相对而言,这是一个简单直接的案例。如果您真的想抱怨C#中的接口语义混乱,我会花时间抱怨
接口重新实现语义
。那真的是在烤人们的面条。我总是必须在规范中查找该内容,以确保我正确理解了语义。