Почему динамические языки, такие как Ruby и Python, не имеют концепции интерфейсов, как в Java или C #? - PullRequest
14 голосов
/ 04 апреля 2009

К моему удивлению, я все больше интересуюсь динамическими языками, такими как Ruby и Python. Утверждение состоит в том, что они на 100% объектно-ориентированы, но, как я читал, по нескольким базовым понятиям, таким как интерфейсы, перегрузка методов, перегрузка операторов отсутствуют. Это как-то встроено под крышку или эти языки просто не нужны? Если последние верны, они на 100% объектно-ориентированы?

РЕДАКТИРОВАТЬ: Основываясь на некоторых ответах, я вижу, что перегрузка доступна как в Python, так и в Ruby, так ли это в Ruby 1.8.6 и Python 2.5.2 ??

Ответы [ 5 ]

18 голосов
/ 04 апреля 2009

Динамические языки используют Duck Typing . Любой код может вызывать методы любого объекта, который поддерживает эти методы, поэтому концепция интерфейсов посторонний. Python фактически поддерживает перегрузку операторов , как и Ruby .

В любом случае, вы, кажется, концентрируетесь на аспектах, которые не важны для объектно-ориентированного программирования . Основное внимание уделяется таким понятиям, как инкапсуляция, наследование и полиморфизм, которые на 100% поддерживаются в Python и Ruby.

17 голосов
/ 04 апреля 2009

Благодаря позднему связыванию они им не нужны. В Java / C # интерфейсы используются для объявления того, что у некоторого класса есть определенные методы, и это проверяется во время компиляции; в Python проверяется, существует ли метод во время выполнения.

Перегрузка метода в Python работает:

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

Они объектно-ориентированы? Я бы сказал, да. Это скорее подход, нежели если какой-либо конкретный язык имеет функцию X или функцию Y .

5 голосов
/ 04 апреля 2009

Я могу говорить только за python, но были предложения по интерфейсам , а также примеры написанных на домашнем интерфейсе в прошлом.

Однако способ, которым python работает с объектами, динамически имеет тенденцию в некоторой степени уменьшать необходимость (и преимущества) интерфейсов.

При использовании динамического языка привязка типов происходит во время выполнения - интерфейсы в основном используются для ограничения времени компиляции объектов - если это происходит во время выполнения, это устраняет некоторую необходимость в интерфейсах.

2 голосов
/ 04 апреля 2009

именной полиморфизм

"Для тех из вас, кто не знаком с Python, вот краткое введение в полиморфизм на основе имен. У объектов Python есть внутренний словарь, содержащий строку для каждого атрибута и метода. Когда вы обращаетесь к атрибуту или методу в коде Python, Python просто ищет строку в dict. Поэтому, если вам нужен класс, который работает как файл, вам не нужно наследовать от файла, вы просто создаете класс, который имеет необходимые методы файла.

Python также определяет набор специальных методов, которые вызываются с помощью соответствующего синтаксиса. Например, a + b эквивалентно a. add (b). Есть несколько мест внутри Python, где он напрямую манипулирует встроенными объектами, но полиморфизм на основе имен работает, как вы ожидаете, примерно в 98% случаев. «

1 голос
/ 04 апреля 2009

Python обеспечивает перегрузку операторов, например Вы можете определить метод __add__, если хотите перегрузить +.

Обычно вам не нужно предоставлять перегрузку метода, поскольку вы можете передавать произвольные параметры в один метод. Во многих случаях этот единственный метод может иметь одно тело, которое работает для всех видов объектов одинаково. Если вы хотите иметь разный код для разных типов параметров, вы можете проверить тип или выполнить двойную диспетчеризацию.

Интерфейсы в основном не нужны из-за типизации утки, как указывает Росфабрикант. Несколько оставшихся случаев покрыты в Python ABC (абстрактными базовыми классами) или интерфейсами Zope.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...