【问题标题】:How is it possible to have an interface implemented as a protected method?如何将接口实现为受保护的方法?
【发布时间】:2013-11-04 02:50:07
【问题描述】:

我刚刚偶然发现IController,并注意到它有一个方法Execute。我的问题是,鉴于Controller 派生自实现接口IController 的ControllerBase,那么ControllerBase 怎么能将Execute 实现为protected virtual?

我的理解是接口必须实现为公共方法。我对此的理解更加复杂,因为您不能在实例化的Controller 上调用Execute,而必须将其转换为IController 的实例。

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

再补充一点,我知道显式接口实现,但是如果你 view the source code for ControllerBase 在你会看到该方法实现为 protected virtual void Execute(RequestContext requestContext)

【问题讨论】:

  • 你能把你的编译代码贴在这里吗?
  • @Konstantin Spirin:他说的是System.Web.Mvc.IController 和System.Web.Mvc.ControllerBase。

标签: c# asp.net-mvc interface


【解决方案1】:

这称为显式接口实现。

实现接口的类可以显式实现成员 那个界面。 当一个成员被显式实现时,它 不能通过类实例访问,只能通过 接口实例。

在 MSDN 上阅读更多信息:Explicit Interface Implementation Tutorial。

简单示例:

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

【讨论】:

  • 我理解这一点,但我不认为这是因为源实现该方法如下:protected virtual void Execute(RequestContext requestContext)。该方法没有明确实现。见aspnetwebstack.codeplex.com/SourceControl/latest#src/…
  • 查看代码中的最后一个方法:void IController.Execute(RequestContext requestContext) 作为结尾 - 接口成员的显式实现。
  • 看得很清楚,先生。我完全错过了那个!
  • @Sam 因为接口契约已经被显式实现实现了,你可以声明另一个同名的方法。它可以有任何访问修饰符。希望现在一切都清楚了。
猜你喜欢
  • 2010-11-17
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 2013-04-07
  • 2013-09-02
  • 1970-01-01
  • 2010-09-21
  • 2016-07-25
相关资源
最近更新 更多