为了账号安全,请及时绑定邮箱和手机立即绑定

为什么要明确实现接口?

/ 猿问

为什么要明确实现接口?

慕盖茨9453107 2019-10-09 16:40:03

那么,显式实现接口的好用例到底是什么?

仅仅是为了使使用该类的人们不必查看intellisense中的所有那些方法/属性?


查看完整描述

3 回答

?
潇湘沐

如果您使用相同的方法和不同的实现来实现两个接口,则必须显式实现。


public interface IDoItFast

{

    void Go();

}

public interface IDoItSlow

{

    void Go();

}

public class JustDoIt : IDoItFast, IDoItSlow

{

    void IDoItFast.Go()

    {

    }


    void IDoItSlow.Go()

    {

    }

}


查看完整回答
反对 回复 2019-10-09
?
喵喵时光机

隐藏非首选成员很有用。例如,如果您同时实现这两种方法IComparable<T>,IComparable通常最好隐藏隐藏的IComparable重载,以免给人以为您可以比较不同类型的对象。同样,某些接口(例如)也不符合CLS IConvertible,因此,如果您未明确实现该接口,则要求CLS符合性的语言的最终用户将无法使用您的对象。(如果BCL实现者没有隐藏原语的IConvertible成员,那将是灾难性的:)


另一个有趣的注释是,通常使用这样的构造意味着显式实现接口的构造只能通过对接口类型进行装箱来调用它们。您可以使用通用约束来解决此问题:


void SomeMethod<T>(T obj) where T:IConvertible

将int传递给int时,它不会装箱。


查看完整回答
反对 回复 2019-10-09
?
胡子哥哥

明确实现接口的一些其他原因:


向后兼容性:万一ICloneable接口发生变化,实现方法类成员不必更改其方法签名。


更干净的代码:如果将Clone方法从ICloneable中删除,则会出现编译器错误,但是,如果隐式实现该方法,则可能会得到未使用的“孤立”公共方法


强类型化:为了举例说明超级猫的故事,这将是我的首选示例代码,当您直接将其作为实例成员调用时,ICloneable显式实现允许Clone()强类型化MyObject:


public class MyObject : ICloneable

{

  public MyObject Clone()

  {

    // my cloning logic;  

  }


  object ICloneable.Clone()

  {

    return this.Clone();

  }

}


查看完整回答
反对 回复 2019-10-09

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信