动态语言界面?

时间:2010-04-21 22:09:00

标签: interface dynamic-languages

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

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

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

感谢。

3 个答案:

答案 0 :(得分:2)

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

  • 类似接口的类可以提供方法的默认实现;
  • 鸭子打字很好,但在某种程度上;有时能够编写isinstance(x, SomeType)是有用的,特别是当SomeType包含许多方法时。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

在Ruby中,它是一种动态类型语言并且只允许单继承,您可以通过mixins模仿“接口”,而不是使用“接口”的方法来污染类。

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

实现接口(在抽象意义上,不是静态类型语言中的实际接口类型)您可以将模块定义为静态语言中的接口。然后,您将其包含在课程中。瞧!你已经把鸭子类型收集到本质上是一个接口。

非常简化的例子:

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"

Equippable是Hero,Mount以及包含它的任何其他类或模型的接口。

(显然,武器很可能是由初始化程序动态设置的,在本例中已经简化了。)

相关问题