当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么使用显式接口实现来调用受保护的方法?》经验,为你挑选了1个好方法。

在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.不过,我不确定为什么作者这样做.

有谁知道这种界面实现的更多好处?



1> Marc Gravell..:

好吧,不是特定于MVC,但这种方法允许您保持核心公共API干净.如果存在具有相同名称和签名但具有不同含义的不同接口/等的风险,则它也是有用的.实际上这很少见.

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

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

如果我们使用一个公用虚拟方法,我们就不能override使用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() { ... }
}

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

Foo.Clone()

Bar.Clone()

ICloneable.Clone()

都使用CloneCore()具体类型的正确实现.

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有