为什么C#不支持显式实现虚拟方法?

Jus*_*dro 3 c# virtual-functions interface explicit-implementation

可以显式实现C#中的接口方法,以便在将实例显式强制转换为接口类型时调用它们的实现.为什么在类的虚方法上也不支持这个?

尽管解决"多重继承"问题对于接口来说是独一无二的,但似乎由于其他原因明确实现了成员对接口有用,它们对虚拟方法也很有用.我们想到一个更清洁的返回型协方差模型.

编辑:按要求,一个例子:

public class Foo {
    ...
}

public class Bar : Foo {
   ...
}

class Base {
   abstract Foo A ();
}

class Dervied {
  private Bar _b;

  Bar A () {
    return _b;
  }

  Foo Base.A () {
    return _b;
  }
}
Run Code Online (Sandbox Code Playgroud)

我知道使用辅助方法来模拟这个,但是净效果似乎具有显式实现可能具有的任何不良特性,但具有更脏的API.我的问题的关键不在于如何做返回类型协方差,而是为什么虚拟方法不支持类似的接口机制.

Cod*_*aos 5

有些人建议首先没有public virtual方法.但是,创建一个public表示使用者界面的非虚方法,以及一个protected virtual表示实现者接口的方法.

我不打算将调用者和实施者的合同分开"混淆设计".在许多情况下,它是更清洁的IMO,但我通常太懒,实际上这样做.

这种设计在返回类型协方差和方法隐藏方面效果更好.

这样做的另一个好处是public包装器可以添加额外的检查代码并支持调用者和实现者的不同合同.

我将如何模拟返回类型协方差的示例:

public class Base
{
    protected virtual Base FooOverride(int i){return new Base();};//FooOverride does not need to duplicate the argument checking

    public Base Foo(int i)
    {
        if(i<0)
          throw new ArgumentException("i<0");
        return FooOverride(i);
    }
}

public class Derived:Base
{
    protected override Base FooOverride(int i){return new Derived();};
    public new Derived Foo(int i)
    {
        return (Derived)base.Foo();
    }
}
Run Code Online (Sandbox Code Playgroud)