加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为什么要使用显式接口实现来调用受保护的方法?

发布时间:2020-12-15 03:58:43 所属栏目:百科 来源:网络整理
导读:在 codeplex中浏览ASP.NET MVC源代码时,我发现有一个类显式地实现了接口.显式实现的方法/属性然后调用另一个具有相同名称的“受保护的虚拟”方法/属性. 例如, public class MvcHandler : IHttpHandler,IRequiresSessionState { protected virtual bool IsReu
在 codeplex中浏览ASP.NET MVC源代码时,我发现有一个类显式地实现了接口.显式实现的方法/属性然后调用另一个具有相同名称的“受保护的虚拟”方法/属性.

例如,

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

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

我现在确定这种编程有什么好处.对于我来说,我宁愿只是隐式地实现IHttpHandler的接口.

我猜作者只是不想要MvcHandler有一个公共属性IsResuable.只有当MvcHandler的实例被视为IHttpHandler时,才可以使用属性IsReusable.不过,我不知道为什么这个作者是这样的.

任何人对这种接口实现方式了解更多的好处?

解决方法

那么,MVC并不具体,但是这种方法允许你保持核心的公共API清洁.如果有不同接口/ etc具有相同名称&签名,但意义不一.在现实中这是罕见的.

它还允许您提供一个实现,您希望在子类中更改返回类型:

(为了简单起见,ICloneable被选择 – 不要挂起这样一个界定不好界面的事实:一个更好的例子就是像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(); }
}

如果我们使用了一个公共虚拟方法,我们将无法重写它,并在基类中使用新的,因为你不允许同时执行这两个方法:

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() { ... }
}

使用受保护的虚拟方法,任何用途:

> Foo.Clone()
> Bar.Clone()
> ICloneable.Clone()

对于具体类型,所有这些都使用正确的CloneCore()实现.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读