Интерфейс на динамическом языке? - PullRequest
7 голосов
/ 22 апреля 2010

Интерфейс (или абстрактный класс со всеми абстрактными методами) является мощным оружием в языке статической типизации, таком как C #, JAVA.Это позволяет различным производным типам использоваться в унифицированной форме.Шаблоны проектирования побуждают нас максимально использовать интерфейс.

Однако на языке с динамической типизацией все объекты не проверяются на предмет их типа во время компиляции.Им не нужно реализовывать интерфейс, который будет использоваться определенным образом.Вам просто нужно убедиться, что у них есть определенные методы (атрибуты).Это делает интерфейс ненужным или, по крайней мере, не таким полезным, как на статическом языке.

Имеет ли типичный динамический язык (например, ruby) интерфейс?Если это так, то каковы его преимущества?Если этого не произойдет, то теряем ли мы многие красивые шаблоны дизайна, которые требуют интерфейса?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 22 апреля 2010

Я думаю, что нет единого ответа для всех динамических языков. В Python, например, нет интерфейсов, но есть множественное наследование. Использование интерфейсоподобных классов все еще полезно:

  • Интерфейсные классы могут обеспечивать реализацию методов по умолчанию;
  • Утиная печать - это хорошо, но в некоторой степени; иногда полезно иметь возможность писать isinstance(x, SomeType), особенно когда SomeType содержит много методов.
1 голос
/ 22 апреля 2010

Интерфейсы на динамических языках полезны в качестве документации API, которые могут быть проверены автоматически, например, средствами разработки или утверждениями во время выполнения.

Например, zope.interface является стандартом де-факто для интерфейсов в Python. Такие проекты, как Zope и Twisted, которые предоставляют огромные API-интерфейсы для потребления, находят его полезным, но, насколько я знаю, он мало используется за пределами проектов такого типа.

0 голосов
/ 16 мая 2014

В Ruby, который является языком с динамической типизацией и допускает только одиночное наследование, вы можете имитировать «интерфейс» через миксины, а не загрязнять класс методами «интерфейса».

Миксины частично имитируют множественное наследование, что позволяет объекту «наследовать» от нескольких источников, но без двусмысленности и сложности фактического наличия нескольких родителей. Истинный родитель есть только один.

Для реализации интерфейса (в абстрактном смысле, а не фактического типа интерфейса, как в языках со статической типизацией) Вы определяете модуль, как если бы он был интерфейсом на статическом языке. Затем вы включаете его в класс. Вуаля! Вы собрали тип утки в то, что по сути является интерфейсом.

Очень упрощенный пример:

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 и любого другого класса или модели, в который он входит.

(Очевидно, что оружие, скорее всего, будет динамически устанавливаться инициализатором, который был упрощен в этом примере.)

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