Question

Interface (ou une classe abstraite avec toutes les méthodes abstraites) est une arme puissante dans un langage statique typé comme C #, JAVA. Il permet à différents types dérivés à utiliser d'une manière uniforme. Les modèles de conception nous encouragent à utiliser l'interface, autant que possible.

Cependant, dans une langue typé dynamique, tous les objets ne sont pas vérifiées pour leur type au moment de la compilation. Ils ne doivent pas mettre en œuvre une interface à utiliser d'une manière spécifique. Vous devez juste vous assurer qu'ils ont des méthodes (attributs) définis. Cela rend interfacer pas nécessaire, ou du moins pas aussi utile que dans une langue statique.

Est-ce un langage dynamique typique (par exemple rubis) ont l'interface? Dans le cas contraire, quels sont les avantages de l'avoir? Si elle ne le fait pas, alors nous perdons beaucoup des beaux modèles de conception qui nécessitent une interface?

Merci.

Était-ce utile?

La solution

Je suppose qu'il n'y a pas de réponse unique pour toutes les langues dynamiques. En Python, par exemple, il n'y a pas d'interfaces, mais il y a l'héritage multiple. L'utilisation de classes comme interface est toujours utile:

  • Interface comme les classes peuvent fournir la mise en œuvre par défaut des méthodes;
  • Canard-frappe est bonne, mais dans une certaine mesure; parfois, il est utile de pouvoir écrire isinstance(x, SomeType), surtout quand SomeType contient nombre méthodes.

Autres conseils

Interfaces dans les langues dynamiques sont utiles en tant que documentation d'API qui peut être vérifié automatiquement, par exemple par des outils de développement ou lors de l'exécution affirme.

A titre d'exemple, zope.interface est la norme de fait pour les interfaces en Python. Des projets tels que Zope et Twisted qui exposent les API énormes pour la consommation trouvent utile, mais pour autant que je sais que ce n'est pas beaucoup à l'extérieur de ce type de projets.

Dans Ruby, qui est un langage typé dynamiquement et ne permet que l'héritage unique, vous pouvez imiter une « interface » via mixins, plutôt que de polluer la classe avec les méthodes de la « interface ».

Mixins mimétique partiellement l'héritage multiple, ce qui permet un objet à « inherit » à partir de plusieurs sources, mais sans l'ambiguïté et la complexité d'avoir fait plusieurs parents. Il n'y a qu'un seul vrai parent.

Pour implémenter une interface (dans le sens abstrait, pas un type d'interface réelle dans les langues statiquement typé) Vous définissez un module comme si elle était une interface dans une langue statique. Vous indiquez ensuite dans la classe. Le tour est joué! Vous avez recueilli le type de canard dans ce qui est essentiellement une interface.

exemple très simplifié:

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 est l'interface pour Hero, Mont, ainsi que toute autre classe ou modèle qui inclut.

(De toute évidence, l'arme sera très probablement fixé dynamiquement par un initialiseur, qui a été simplifié loin dans cet exemple.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top