【问题标题】:What is the advantage of using Interface?使用接口有什么好处?
【发布时间】:2011-04-14 10:30:20
【问题描述】:

使用接口有什么用?

听说用它来代替多重继承,也可以用它来隐藏数据。

还有其他优势吗,接口在哪里使用,程序员如何识别需要该接口?

explicit interface implementationimplicit interface implementation 有什么区别?

【问题讨论】:

  • 查看策略设计模式,您会发现它的强大之处。这应该能让你很好地理解。
  • @MrShoubs 如果我说我可以在不使用接口的情况下实现策略设计模式,我会不会遗漏一些东西?

标签: c# .net oop


【解决方案1】:

为了解决隐式/显式问题,假设两个不同的接口具有相同的声明:

interface IBiographicalData

    {
       string LastName
       {
          get;
          set;
       }

    }

    interface ICustomReportData
    {
       string LastName
       {
          get;
          set;
       }
    }

你有一个实现这两个接口的类:

class Person : IBiographicalData, ICustomReportData
{
    private string lastName;

    public string LastName
    {
        get { return lastName; }
        set { lastName = value; }
    }
}

类人隐式实现了这两个接口,因为您使用以下代码获得相同的输出:

Person p = new p();
IBiographicalData iBio = (IBiographicalData)p;
ICustomReportData iCr = (ICustomReportData)p;

Console.WriteLine(p.LastName);
Console.WriteLine(iBio.LastName);
Console.WriteLine(iCr.LastName);

但是,要显式实现,您可以像这样修改 Person 类:

class Person : IBiographicalData, ICustomReportData
{
    private string lastName;

    public string LastName
    {
        get { return lastName; }
        set { lastName = value; }
    }

    public string ICustomReportData.LastName
    {
        get { return "Last Name:" + lastName; }
        set { lastName = value; }
    }
}

现在是代码:

Console.WriteLine(iCr.LastName);

将以“姓氏:”为前缀。

http://blogs.msdn.com/b/mhop/archive/2006/12/12/implicit-and-explicit-interface-implementations.aspx

【讨论】:

    【解决方案2】:

    接口非常有用

    • 依赖注入
    • 控制反转
    • 测试隔离

    【讨论】:

      【解决方案3】:

      接口只是将类 API 的描述与其实现分开。它是关于关注点分离,这是任何强大的软件项目的基础。您可以在不破坏任何其他代码的情况下替换实现类。

      其中一个特别有用的领域是单元测试,因为它允许您模拟出您不想测试的接口作为给定测试用例的一部分。

      让完全不相关的类实现相同的接口还允许您编写可以对不同层次结构中的不同类进行操作的方法(即除了对象之外没有共同的祖先),而不必将对象作为它们的类型。例如,您可以编写一个采用 IEnumerable 的方法,并将其传递给 List、Array 等。如果没有接口或通用基类型,这是不可能的(除非从对象进行强制转换)。

      【讨论】:

        【解决方案4】:

        用最基本的术语,我们回到 OOP 101:

        继承:对象 B“是”对象 A 的一种类型。对象 A 实现的行为和方法由对象 B 继承、实现和全部(有一些覆盖空间)。

        接口:对象 A 和对象 B 都是由公共接口表示的抽象对象的“行为类似”示例。 James Gaunt 使用上面的 Ienumerable 示例。其他示例可能是 IPrintable、IDisposable 等。

        对于实现这些接口的任何给定类,其实现可能会大不相同(想想您如何在使用 dispose 方法的不同类中实现 IDisposable)。但是,客户端代码不需要知道或关心实际对象的类型是什么——代码可以简单地通过接口访问所需的属性和方法。

        继承通常被视为对许多编码问题的“神奇”解决方案,但也被广泛误用作避免编写更多代码的方法。我不同意 user492238 的观点,即使用接口完成的事情可以通过继承轻松完成。这种方法通常会把你逼入绝境。而且,正如 Jodrell 所观察到的,多重继承不是 .net 的一个特性(在我看来,这是理所当然的)。

        当您发现自己在多个(或许多)其他不相关的类中实现相同的行为时,请考虑定义一个接口,为该行为提供 API。 您可能有几个类:Person、Animal、Building 等。所有这些都可能需要提供可打印输出的方法。您可能还有一个接受 IPrintableObject 作为参数的方法。在这种情况下,您可以在需要打印的任何类中实现 IPrintableObject,在每个对象中提供实现代码,并将它们提供给客户端代码。

        【讨论】:

          【解决方案5】:

          大多数——如果不是全部的话——可以通过接口完成的事情也可以通过继承来完成。接口可用于替换使用抽象基类的类设计。更喜欢哪一个主要取决于个人经验和品味。 (当然,有些人对何时更喜欢一个比另一个有非常严格的规定)。

          确实存在迫使您使用接口的框架(通常与 DI containern 结合使用)。

          【讨论】:

          • 只能继承一次(在c#中)
          【解决方案6】:

          接口是契约;这是指定的方法和属性可用的保证。它不提供实现,这就是它与提供实现的类不同的原因。

          接口是最高级别的抽象,它不向消费者提供实现细节。

          接口在语义上几乎等同于纯抽象类(不提供任何实现的类)。在c#、vb.net等语言中,类可以有多个接口,但只能有一个基类。因此,接口相对于类(抽象或其他)的一个特定优势是您可以实现多个接口,但只能从一个类继承。

          【讨论】:

            【解决方案7】:

            对于更有经验的程序员来说,这可能更像是一个问题而不是答案,但是...... 大部分时间我都和小团队一起工作,我们很亲密,彼此很了解。我想知道接口到底是什么。但我的上一个项目是与新团队合作的,规模略大。这是一团糟。一段时间后我得出结论:我们应该使用接口。

            不是作为解决任何技术问题的一种方式,而是作为一种设计文档,它在代码中,它迫使你遵循这个难以忽视的设计,这将使合作变得容易100倍。坐在一起想出界面没问题。然后你可以单独拆分和实现东西。但是如果你遵循界面,那么团队中的每个其他人都可以更清楚地阅读课程理念。

            所以,我最好的猜测是,接口确实是安排合作的好方法:随心所欲地实现,但接口之外没有任何公共接口,并且重写接口必须与其他相关人员一起完成。保持代码井井有条并区分常见内容和您唯一的内容的简单方法。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-11-13
              • 2018-02-14
              • 1970-01-01
              • 1970-01-01
              • 2012-01-21
              • 1970-01-01
              • 1970-01-01
              • 2017-03-27
              相关资源
              最近更新 更多