gpt4 book ai didi

c# - 为什么要使用显式接口(interface)实现来调用 protected 方法?

转载 作者:可可西里 更新时间:2023-11-01 09:01:42 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com