接口(或所有方法抽象的抽象类)是静态类型语言(如C#,JAVA)中的强大武器。它允许以统一的方式使用不同的派生类型。设计模式鼓励我们尽可能地使用界面。
但是,在动态类型语言中,在编译时不会检查所有对象的类型。它们不必实现以特定方式使用的接口。您只需要确保它们定义了一些方法(属性)。这使得接口不是必需的,或者至少不像在静态语言中那样有用。
典型的动态语言(例如ruby)是否有界面?如果确实如此,那么拥有它有什么好处?如果没有,那么我们是否会失去许多需要界面的漂亮设计模式?
感谢。
答案 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以及包含它的任何其他类或模型的接口。
(显然,武器很可能是由初始化程序动态设置的,在本例中已经简化了。)