如何将接口实现为受保护的方法?

4
我刚刚碰巧发现了 IController,并注意到它有一个方法 Execute。我的问题是,考虑到 Controller 派生自实现接口 IControllerControllerBaseControllerBase 如何将 Execute 实现为 protected virtual
我理解接口必须实现为公共方法。我对此的理解更加复杂,因为您不能在实例化的 Controller 上调用 Execute,而必须将其强制转换为 IController 的实例。
如何可能将接口实现为受保护的方法?
再补充一点,我知道显式接口实现,但是如果您查看 ControllerBase源代码,您将看到该方法被实现为 protected virtual void Execute(RequestContext requestContext)

你能在这里发布你的编译代码吗? - Konstantin Spirin
1
@Konstantin Spirin:他正在谈论 System.Web.Mvc.IControllerSystem.Web.Mvc.ControllerBase - BoltClock
1个回答

7

这被称为显式接口实现。

实现接口的类可以显式地实现该接口的成员。 当成员被显式实现时,它不能通过类实例访问,只能通过接口实例访问

在 MSDN 上阅读更多信息:显式接口实现教程

简单示例:

interface IControl
{
    void Paint();
}

public class SampleClass : IControl
{
    void IControl.Paint()
    {
        System.Console.WriteLine("IControl.Paint");
    }

    protected void Paint()
    {
        // you can declare that one, because IControl.Paint is already fulfilled.
    }
}

使用方法:

var instance = new SampleClass();

// can't do that:
// instance.Paint();

// but can do that:
((IControl)instance).Paint();

1
我理解这一点,但是考虑到源代码实现了以下方法:protected virtual void Execute(RequestContext requestContext),我并没有认为这是情况。该方法并未明确实现。请参见http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/ControllerBase.cs。 - Sam
请查看代码中的最后一个方法:void IController.Execute(RequestContext requestContext),它是您接口成员的显式实现。 - MarcinJuraszek
非常敏锐的发现,先生。我完全忽略了那个! - Sam
@Sam 因为接口契约已经通过显式实现得到了满足,所以您可以声明另一个具有相同名称的方法。并且它可以具有任何访问修饰符。希望现在一切都清楚了。 - MarcinJuraszek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接