【问题标题】:Why do dynamic languages like Ruby and Python not have the concept of interfaces like in Java or C#?为什么像 Ruby 和 Python 这样的动态语言没有像 Java 或 C# 那样的接口概念?
【发布时间】:2010-10-17 11:13:08
【问题描述】:

令我惊讶的是,我对 Ruby 和 Python 等动态语言越来越感兴趣。声称它们是 100% 面向对象的,但是当我读到几个基本概念(如接口、方法重载、运算符重载)时,它们都缺失了。它是以某种方式内置在封面下,还是这些语言不需要它?如果后者是真的,那么它们是 100% 面向对象的吗?

编辑:根据一些答案,我看到重载在 Python 和 Ruby 中都可用,在 Ruby 1.8.6 和 Python 2.5.2 中是这种情况吗??

【问题讨论】:

  • 我不记得方法重载或运算符重载是 OO 语言的要求。但是,我听说他们不是 OO。
  • 在您提到的所有语言中,Java 是唯一一种没有运算符重载的语言。并且方法重载与OOP无关; C 有方法重载。
  • 您可以在 Ruby 1,8,6 中重载运算符
  • PHP 确实有接口。

标签: interface oop dynamic-languages


【解决方案1】:

由于后期绑定,他们不需要它。在 Java/C# 中,接口用于声明某个类具有某些方法,并在编译时进行检查;在 Python 中,在运行时检查方法是否存在。

Python 中的方法重载确实有效:

>>> class A:
...  def foo(self):
...    return "A"
...
>>> class B(A):
...  def foo(self):
...    return "B"
...
>>> B().foo()
'B'

它们是面向对象的吗?我会说是的。这更像是一种方法,而不是任何具体语言是否具有特征 X 或特征 Y

【讨论】:

  • 对不起,不是方法重载。你在那里做的是方法覆盖。方法/函数重载是重用相同名称但具有不同签名的能力,如:func a(String a);函数 a(int a);。在您的示例中,您使用具有相同签名的方法,但在子类中被覆盖。 Wikipedia - OverloadingWikipedia - Overriding
【解决方案2】:

动态语言使用duck typing。 任何代码都可以在任何支持这些方法的对象上调用方法,所以这个概念 的接口是无关的。 Python 实际上支持operator overloadingRuby 也是如此。

无论如何,您似乎专注于对object oriented programming 不重要的方面。主要关注的是封装、继承和多态等概念,Python 和 Ruby 100% 支持这些概念。

【讨论】:

    【解决方案3】:

    我只会说python,但是过去有have been proposals for interfaces以及自制的界面示例。

    然而,python 动态处理对象的方式往往会在一定程度上减少对接口的需求(以及接口的好处)。

    使用动态语言,您的类型绑定发生在运行时 - 接口主要用于对象的编译时间约束 - 如果这发生在运行时,它消除了对接口的一些需求。

    【讨论】:

      【解决方案4】:

      name based polymorphism

      “对于那些不熟悉 Python 的人,这里是基于名称的多态性的快速介绍。Python 对象有一个内部字典,其中包含每个属性和方法的字符串。当您在 Python 代码中访问属性或方法时,Python只需在dict中查找字符串。因此,如果您想要一个像文件一样工作的类,则不需要从文件继承,只需创建一个具有所需文件方法的类即可。

      Python 还定义了一堆特殊的方法,这些方法被适当的语法调用。例如,a+b 等价于 a.add(b)。 Python 内部有几个地方直接操作内置对象,但基于名称的多态性在大约 98% 的情况下都能正常工作。 "

      【讨论】:

        【解决方案5】:

        Python 确实提供了运算符重载,例如如果你想重载+,你可以定义一个方法__add__

        您通常不需要提供方法重载,因为您可以将任意参数传递给单个方法。在许多情况下,该单一方法可以具有以相同方式适用于各种对象的单一主体。如果你想对不同的参数类型有不同的代码,你可以检查类型,或者双重调度。

        正如 rossfabricant 指出的那样,由于鸭子类型,接口大多是不必要的。 Python 中的 ABC(抽象基类)或 Zope 接口涵盖了剩余的一些情况。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-24
          • 2014-04-06
          • 2010-10-17
          • 1970-01-01
          • 2014-04-03
          • 2011-02-06
          • 2011-11-01
          • 2011-04-11
          相关资源
          最近更新 更多