使用Interface有什么好处?

时间:2011-04-14 10:30:20

标签: c# .net oop

使用Interface有什么用?

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

还有其他优点,使用places接口的位置,以及程序员如何识别需要的接口?

explicit interface implementationimplicit interface implementation之间的区别是什么?

7 个答案:

答案 0 :(得分:5)

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

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; }
    }
}

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

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

答案 1 :(得分:2)

接口对

非常有用
  • 依赖注入
  • 控制倒置
  • 测试隔离

答案 2 :(得分:1)

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

这一点特别有用的一个方面是单元测试,因为它允许你模拟出你不想作为给定测试用例的一部分进行测试的接口。

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

答案 3 :(得分:1)

从最基本的术语来看,我们回到OOP 101:

继承:对象B“是对象A的类型。对象A实现的行为和方法是对象B的继承,实现和所有(有一些覆盖空间)。

接口:对象A和对象B都是由“公共接口”表示的抽象对象的“Act Like”示例。 James Gaunt使用了上面的Ienumerable示例。其他示例可能是IPrintable,IDisposable等等。

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

继承通常被视为许多编码问题的“神奇”答案,但也被广泛误用作避免篡改更多代码的手段。我不同意user492238,使用Interfaces完成的事情可以通过继承轻松完成。这种方法通常会让你陷入困境。并且,正如Jodrell所观察到的,多重继承不是.net的特征(在我看来这是正确的)。

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

答案 4 :(得分:0)

大多数 - 如果不是全部 - 可以通过接口完成的事情也可以通过继承来完成。接口可用于使用抽象基类替换类设计。更喜欢哪个主要是个人经验和品味。 (当然,有些人对于什么时候更喜欢一个在另一个之上而制定了非常严格的规则)。

并且存在框架(通常与DI containern结合),这会强制您使用接口。

答案 5 :(得分:0)

接口是合同;它保证指定的方法和属性可用。它没有提供任何实现,这使得它与提供实现的类不同。

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

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

答案 6 :(得分:0)

对于经验丰富的程序员而言,这可能更多的问题而不是答案,但...... 大部分时间我都在和小团队合作,我们很亲密,彼此了解得很好。我想知道界面到底是什么。但我的最后一个项目是新团队,而且规模更大。这是一个冬青混乱。过了一段时间我得出结论:我们应该使用接口。

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

所以,我最好的猜测是,接口是安排合作的好方法:实现你想要的,但是接口之外没有任何公共接口,重写接口必须与其他人一起完成。简单的方法来保持代码的顺序和分离常见的东西,而你的东西只是你的东西。