2010-04-21 3 views
6

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

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

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

Спасибо.

ответ

2

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

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

Мне нравится вторая точка! :) – Shuo

+2

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

+0

@ sepp2k, я согласен. Это не то, что я называю интерфейсом. – Shuo

1

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

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

0

В Ruby, который является динамически типизированным языком и допускает только одно наследование, вы можете имитировать «интерфейс» через 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" 

Экипирующие представляет собой интерфейс для Hero, горы, и любой другой класс или модель, которая включает в себя его.

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

Смежные вопросы