使用显式接口实现是否意味着要隐藏功能?

问题描述

| 我使用接口来解耦代码。我很好奇,使用显式接口实现是为了隐藏功能吗? 例:
public class MyClass : IInterface
{
     void IInterface.NoneWillCall(int ragh) { }
}
通过接口仅显式提供此功能的好处和特定用例是什么?     

解决方法

根据我的经验,它有两个主要用途: 它允许您通过返回值重载方法。例如,
IEnumerable<T>
IEnumerable
都声明了
GetEnumerator()
方法,但是返回类型不同-因此要实现这两种方法,必须显式实现它们中的至少一个。当然,在这个问题中,这两种方法都是由接口提供的,但是有时您只想给与接口方法不同类型的\“ normal \”方法(通常是一种更具体的方法)。 它允许您以“区分”的方式实现接口的一部分-例如,
ReadOnlyCollection<T>
实现
IList<T>
,但使用显式接口实现“不鼓励”变异调用。这将阻止通过具体类型知道对象的调用者调用不适当的方法。这有点让人觉得接口太宽泛或​​实现不当-如果您无法履行其所有合同,为什么还要实现一个接口呢? -但从务实的角度来看,它可能会有用。     ,一个例子是ICloneable。通过显式实现它,您仍然可以拥有一个强类型版本:
public class MyClass : ICloneable {
    object ICloneable.Clone() {
       return this.Clone();
    }

    public MyClass Clone() {
       return new MyClass() { ... };
    }
}
    ,它不是为了隐藏方法,而是使从不同接口以不同方式实现具有相同签名/名称的两个方法成为可能。 如果IA和IB都具有操作F,则只能通过显式实现接口来为每个F实现不同的方法。     ,它可以用于隐藏。例如,某些实现
IDisposable
的类这样做是因为它们也具有执行相同功能的
Close()
方法。 当您在一个类上实现两个接口并且存在签名冲突并且功能因接口而异时,也可以使用显式接口定义。但是,如果发生这种情况,通常表明您的课程做得太多了,您应该考虑将功能分开。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...