【问题标题】:Type hinting classes or interfaces? [duplicate]类型提示类或接口? [复制]
【发布时间】:2014-09-10 10:56:42
【问题描述】:

输入提示类好还是输入提示接口好?

如果我键入提示一个类,我基本上可以传入具有完全相同名称的每个类,但可能不是使用我注入它的类需要正常工作的相同方法。

虽然有了接口,但只要实现了类型提示的接口,我就可以传入任何类(任何名称)。

类型提示类和接口的实际优缺点是什么?

【问题讨论】:

  • 在什么情况下你可以有两个不同的同名类?我无法想象这样的情况。
  • 因此,在类型提示时使用错误的类不是问题。
  • 一般的经验法则是针对接口而不是针对具体实现的代码
  • 好的。那么类型提示类没有真正有用的用途吗?
  • @KidDiamond 为你知道不会有多个实现的类创建接口是没有意义的,特别是如果它们在同一个包中。在这些情况下,键入提示具体类。否则,您会花时间添加界面而没有任何好处。

标签: class oop interface dependency-injection type-hinting


【解决方案1】:

接口定义了一个通用词汇表,没有任何实现细节。这样,您可以在您的代码中使用您只知道存在的方法,而不必担心它是如何实现的。这基本上是一个承诺。接口的优点是,当您以后有类似的需求时,您不必修改某些类来支持不同的目的或使用一些笨拙的继承来覆盖所有内容——您只需传递另一个实现相同接口的类。

换句话说:采用接口的代码基本上只是说“我知道这个方法存在,我知道我可以使用它。除此之外的任何事情我都不担心。”它对你传递给它的数据做了什么,你不必关心。

考虑以下示例:您有一个脚本,该脚本从数据库中获取某些内容并将其返回给实现接口IDataHandler 的对象(缺少一个好名字)。在您通常的情况下,您有一个实现接口的类,它将在数据周围添加一些 HTML,然后将其显示给用户。

但有时您可能不想向用户显示内容,而是希望将其保存到文件中。它所需要的只是另一个实现IDataHandler 方法的类,您可以将它传递给处理数据库的代码。你看到优势了吗?您有另一个具有相同词汇的课程,并且您的数据库处理部分不必更改。

接口很棒,但解决方案当然不是在任何地方都使用它们。如果您有两个紧密耦合的类,并且您看不到任何变化的空间,那么如果您出于显而易见的原因总是传递相同类型的类,那么使用接口是没有意义的。

接口的另一个优点是它有助于协作:接口定义了对象如何相互通信。如果您正在编写一些数据库处理程序类并且您的朋友正在编写一个负责显示数据的类,您可以在开始时定义一个接口,以便您知道可以为您朋友的类使用哪些方法。这也允许其他人根据他们的需要定义一个类并将其传递给您的代码。

拥有多个具有相同名称的类是没有意义的,所以我不会为这种情况而烦恼。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 2021-11-17
    • 2011-03-30
    • 1970-01-01
    • 2020-08-22
    • 2016-01-19
    • 1970-01-01
    相关资源
    最近更新 更多