Interface 动态语言中的接口?

Interface 动态语言中的接口?,interface,dynamic-languages,Interface,Dynamic Languages,接口(或包含所有抽象方法的抽象类)是静态类型语言(如C#、JAVA)的强大武器。它允许以统一的方式使用不同的派生类型。设计模式鼓励我们尽可能多地使用界面 但是,在动态类型化语言中,在编译时不会检查所有对象的类型。他们不必实现以特定方式使用的接口。您只需要确保它们定义了一些方法(属性)。这使得接口没有必要,或者至少不像在静态语言中那样有用 典型的动态语言(如ruby)是否有接口?如果有,那么拥有它的好处是什么?如果没有,那么我们会失去许多需要界面的漂亮设计模式吗 谢谢。我想对于所有的动态语言都没有

接口(或包含所有抽象方法的抽象类)是静态类型语言(如C#、JAVA)的强大武器。它允许以统一的方式使用不同的派生类型。设计模式鼓励我们尽可能多地使用界面

但是,在动态类型化语言中,在编译时不会检查所有对象的类型。他们不必实现以特定方式使用的接口。您只需要确保它们定义了一些方法(属性)。这使得接口没有必要,或者至少不像在静态语言中那样有用

典型的动态语言(如ruby)是否有接口?如果有,那么拥有它的好处是什么?如果没有,那么我们会失去许多需要界面的漂亮设计模式吗


谢谢。

我想对于所有的动态语言都没有单一的答案。例如,在Python中,没有接口,但存在多重继承。使用类接口类仍然很有用:

  • 类接口可以提供方法的默认实现
  • 鸭子打字很好,但在一定程度上;有时,能够编写
    isinstance(x,SomeType)
    非常有用,尤其是当
    SomeType
    包含许多方法时

动态语言中的接口可用作API文档,可在运行时通过开发工具或断言等自动检查


例如,是Python中接口的事实标准。像Zope和Twisted这样公开巨大API供使用的项目发现它很有用,但据我所知,它在这类项目之外并没有太多使用。

在Ruby中,它是一种动态类型化语言,只允许单一继承,您可以通过mixin模拟“接口”,而不是用“接口”

mixin部分模仿多重继承,允许对象从多个源“继承”,但没有实际具有多个父对象的模糊性和复杂性。只有一个真正的父对象

为了实现一个接口(在抽象意义上,不是静态类型语言中的实际接口类型),您定义了一个模块,就好像它是静态语言中的接口一样。然后您将它包含在类中。瞧!您已经将duck类型收集到了本质上是接口的部分

非常简单的示例:

module Equippable
  def weapon
    "broadsword"
  end
end


class Hero
  include Equippable

  def hero_method_1
  end

  def hero_method_2
  end
end


class Mount
  include Equippable

  def mount_method_1
  end
end


h = Hero.new
h.weapon    # outputs "broadsword"


m = Mount.new
m.weapon    # outputs "broadsword"
Equipable是Hero、Mount和任何其他包含它的类或模型的接口


(显然,武器很可能由初始值设定项动态设定,本例中已对其进行了简化。)

如果一个类提供默认的实现,它就不是接口,因为接口与抽象类的区别在于它们不能包含任何实现。@sepp2k,我同意。这不是我所说的接口。@sepp2k:大多数语言/框架的根本区别在于接口不支持中间层l成员重写,一个类可以实现多个接口。允许接口方法在其声明点指定默认实现不会启用任何致命的菱形场景,但会大大提高许多操作的效率,如
IEnumerable
,尤其是那些嵌套在聚合类型中,如由
Append
生成的聚合类型。例如,如果调用
Append
以加入一个5000000项集合……它可以通过读取字段返回其
计数
,以及一个不知道其计数的五项集合,其中
Count
IEnumerable
的成员默认情况下,将遍历集合并计数成员将允许聚合对象相对高效地获取其报告
count
(有必要遍历五项集合,但不是5000000项集合)如果对象能够“很好地”实现它们,那么让对象只实现
Count
之类的功能,就不可能实现有效的聚合。