c# - 为什么要使用显式接口(interface)实现来调用 protected 方法?

标签 c# interface implicit explicit-interface

codeplex 中浏览 ASP.NET MVC 源代码时,我发现有一个显式实现接口(interface)的类是很常见的。显式实现的方法/属性然后调用另一个具有相同名称的“ protected 虚拟”方法/属性。

例如,

public class MvcHandler : IHttpHandler, IRequiresSessionState 
{
    protected virtual bool IsReusable 
    {
        get 
        {
           return false;
        }
    }

    bool IHttpHandler.IsReusable 
    {
        get 
        {
           return IsReusable;
        }
    }
}

我现在确定这种编程的好处是什么。对我来说,我更喜欢隐式实现接口(interface) IHttpHandler。

我猜作者只是不想让 MvcHandler 有一个公共(public)属性 IsResuable。属性 IsReusable 只能在 MvcHandler 实例被视为 IHttpHandler 时使用。不过,我不确定为什么作者会这样。

有人知道这种接口(interface)实现方式的更多好处吗?

最佳答案

嗯,不是特定于 MVC,但这种方法可以让您保持核心公共(public) API 的清洁。如果存在不同接口(interface)/等具有相同名称和签名但含义不同的风险,它也很有用。实际上这很少见。

它还允许你提供一个你希望返回类型在子类中改变的实现:

(选择 ICloneable 是为了简单 - 不要因为它是一个定义不佳的接口(interface)而挂断电话......一个更好的例子是 DbCommand 等等,这样做的 - 但在一个简短的例子中很难展示)

class Foo : ICloneable
{
    public Foo Clone() { return CloneCore(); }
    object ICloneable.Clone() { return CloneCore(); }
    protected virtual Foo CloneCore() { ... }
}

class Bar : Foo
{
    protected override Foo CloneCore() { ... }
    public new Bar Clone() { return (Bar)CloneCore(); }
}

如果我们使用了公共(public)虚方法,我们将无法覆盖并且在基类中使用new ,因为您不能同时执行这两项操作:

class A
{
    public virtual A SomeMethod() { ... }
}
class B : A
{
    public override A SomeMethod() { ... }
    //Error 1   Type 'B' already defines a member called 'SomeMethod' with the same parameter types
    public new B SomeMethod() { ... }
}

使用 protected 虚拟方法,任何用法:

  • Foo.Clone()
  • Bar.Clone()
  • ICloneable.Clone()

全部使用具体类型的正确 CloneCore() 实现。

关于c# - 为什么要使用显式接口(interface)实现来调用 protected 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/280495/

相关文章:

scala - 未找到隐式值

java - 是否应该将 Javadoc 注释添加到实现中?

scala - 在 Scala 中提供类型类的实例时使用 vals 还是 object 更好

c# - 隐式类型与匿名类型

c# - Excels 的等效 C# 函数 Norm.S.Inv 函数

list - 为什么 Haskell [] (list) 不是类型类?

java接口(interface)引用向下转型

c# - XmlDocument.Load 错误

c# - 什么是 MVC future 库?

c# - 当我在 C# 中使用 SqlConnection 时出现错误