【问题标题】:About interfaces [duplicate]关于接口 [重复]
【发布时间】:2010-01-29 11:33:40
【问题描述】:

可能重复:
Interfaces: Why cant I seem to grasp them?

C# 中接口的用途是什么?
他们将如何在 c#、Java 中实现可扩展的模块化设计?

就我在接口方面的经验而言,我们在 gridview 场景中使用了列值来自不同对象的情况。

(例如:

List<IPub> list = new List<IPub>();
gridview.DataSource = list;
gridview.DataBind();

IPub 有 4 种方法,由 4 或 5 个不同的类实现。 ) 除了上面的这些,和他们的同类相比,他们还有什么用处?

我听说 Java 的创建者鄙视接口,或者说“如果我有机会再次设计 Java;我永远不会将接口变成语言”。 这是否也适用于 C#? 是什么暗示让他这么说? 我觉得我从来没有完全理解过接口。 请有人费心解释。
编辑:这是 Goslings quote,请参阅 Java 部分

【问题讨论】:

  • 这个问题已经问了好几次了...
  • 您能提供该报价的参考吗?
  • 你的报价全错了。 Gosling 说他会省略extends,即实现继承,而不是接口继承。 javaworld.com/javaworld/jw-08-2003/jw-0801-toolbox.html
  • 我很抱歉。每当我发布一些东西时,我都会仔细检查。

标签: c# java interface


【解决方案1】:

接口可以被认为是“可以做的”,而抽象/基类可以被认为是“is-a”。

所以狗是动物,所以你使用了基类。 狗可以做便便,所以便便将是其他动物可能实现的接口上的一种方法..(废话示例)

前几天阅读我的 OO 书籍,它认为应该避免具体实例,优秀的 OO 编码人员总是针对接口或基类进行编程。

考虑到这一点,可能值得购买一本好的 OO / 模式书籍,例如 head first design patterns

【讨论】:

  • 查看它的好方法。 +1 便便双关语!
  • 我也推荐那本书——大纲非常清晰。
【解决方案2】:

您应该看到answers herehereherehere

接口提供了一种使用某事物的方法,而不必担心该事物是如何实现的。

如果你有一个接口ITextGetter 和你正在使用的方法GetText(string textKey),你不知道文本是否来自哪里,你只知道当你用特定键请求文本时,你得到文本。如果您使用此接口编写您的应用程序,那么您可以使用所有实现该接口的不同类来获取文本,而无需更改您的应用程序。这样可以轻松地从基于文件的文本获取切换到基于数据库或基于 Web 服务的文本获取,而无需更改任何使用该接口的代码

【讨论】:

    【解决方案3】:

    接口是一种契约:如果某个类实现了某个接口,则该类保证具有某些方法。当您从某个基类继承时,您可能会有相同的情况,但您不能总是这样做。在这种情况下,接口很容易实现某种多重继承。

    【讨论】:

      【解决方案4】:

      接口的存在使您无需为某事指定大量功能代码。你只需要知道它的作用。这有点像您需要租一辆家用汽车。

      你需要知道
      A)它是一辆可以驾驶的汽车
      B) 它有一个家庭大小的靴子。

      您无需了解汽车的工作原理、发动机的工作原理。你只需要知道它可以做A)和B)。这就是接口的目的。

      在 C# 中,我们不允许多重继承(即拥有超过 1 个基类),因此如果您想定义超过 1 个接口的行为,则无法使用类来实现。如果存在多重继承,则可以选择使用多个基类来执行此操作。

      【讨论】:

        【解决方案5】:

        嗯,在开发 java 的时候,有一个叫做“多重继承”的东西,其中类可以从两个(或更多)不同的类派生。

        例如,您有一个“Vehicle”类和一个“Animal”类,您可以有一个从这两者派生的“Horse”类。

        问题是,如果您想从两个具有共同函数名的类派生一个类怎么办?你真的不能,这个函数会有两个底层实现。

        例如,Vehicle 和 Animal 类可能有一个“move()”函数。好吧,如果您自己不覆盖它,那么当您调用 horse.move() 时会发生什么?这是未定义的!任何一个都可以被调用!

        因此,在 Java 中,您只能从一个类派生。但是,如果您真的需要一个与不止一种类型兼容的类怎么办?例如,如果您有一个数据库连接,该连接需要派生一个基类以使用 DB,但还需要能够像具有 close() 函数的资源一样进行管理。

        好的,所以他们创建了“接口”。当您实现一个接口时,您不必担心下面的竞争代码,因为您必须自己实现它们。


        人们普遍认为多重继承是一种“被认为是有害的”(如 GOTO),而接口是一种获得好处而没有坏处的方法。但是,现在还有其他方法可以做到这一点。例如“DuckTyping”,只要类实现了特性名称,就可以使用。

        另外,java 现在可以做嵌套类,所以如果你需要你的类从两个类派生,你可以创建一个从第二个类派生的内部类。

        不同的方法各有优缺点,但接口并不是当今唯一想要解决多重继承问题的方法。

        【讨论】:

          【解决方案6】:

          接口为您提供了一种有效地进行多重继承的方法(您不能从多个抽象基类继承)。如果您问自己为什么要禁止多类继承,只需阅读 Bjarne Stroustroup 的一本书(关于 C++)中的相关章节,您就会知道它变得多么复杂。

          另一方面,当您使用单元测试时,几乎您创建的每个接口都至少有 2 个实现 - 真实的实现和用于测试的模拟实现。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-10-04
            • 1970-01-01
            • 2017-09-28
            • 2013-10-27
            • 2020-01-25
            • 1970-01-01
            • 2012-05-26
            • 1970-01-01
            相关资源
            最近更新 更多