gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:02:09 26 4
gpt4 key购买 nike

C# 中的接口(interface)方法可以显式实现,因此在将实例显式转换为接口(interface)类型时调用它们的实现。为什么这在类的虚方法上也不支持?

虽然解决“多重继承”问题是接口(interface)所独有的,但似乎出于所有其他原因,显式实现的成员对接口(interface)很有用,它们对虚拟方法也很有用。我想到了一个更简洁的返回型协方差模型。

编辑:根据要求,一个例子:

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;
}
}

我知道使用辅助方法来模拟这一点,但最终效果似乎具有显式实现所具有的任何不良特征,但具有更脏的 API。我的问题的关键不是如何进行返回类型协变,而是为什么虚拟方法不支持类似的接口(interface)机制。

最佳答案

有些人建议首先不要使用 public virtual 方法。而是创建一个代表消费者接口(interface)的 public 非虚方法,和一个代表实现者接口(interface)的 protected virtual 方法。

我不会将调用者和实现者的契约(Contract)分开称为“混淆设计”。在许多情况下,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();
}
}

关于c# - 为什么 C# 不支持显式实现的虚拟方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6563895/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com