在 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/