web-dev-qa-db-fra.com

Quelle est la différence entre un mixin et un trait?

De ce que je peux dire de Scala et hack-

Mélangements:

  • Peut avoir un état (c.-à-d. Propriétés de l'instance)
  • Ne peut fournir que des méthodes concrètes
  • Peut avoir des constructeurs qui sont appelés dans le même ordre que leurs classes ont été mélangées dans
  • Si A _ mixe dans B et C, A instanceof B == false et A instanceof C == false

Traits:

  • Ne peut fournir que des méthodes, pas l'état
  • Peut déclarer des méthodes abstraites qu'un consommateur doit mettre en œuvre
  • Ne peut pas avoir de constructeurs
  • Si A implémente les traits B et C, A instanceof B == false et A instanceof C == false

Est-ce correct ou je manque quelque chose? Ces définitions sont-elles exactes pour tout OO Language ou juste pour ceux mentionnés ci-dessus?

8
bcherny

PHP n'a pas de concept de mélanges, mais elle a traits qui ressemblent à un mélange de traits et de mélanges de Hack/Scala:

  • Peut définir des propriétés.
  • Peut définir des constructeurs.
  • Peut définir des méthodes abstraites.
  • Ne supporte pas l'héritage.
  • Les traits ne sont pas des types.

Ces définitions sont-elles exactes pour tout langage OO ou uniquement pour ceux mentionnés ci-dessus?

Je ne pense pas qu'il y a même une seule chose qui fonctionnera de la même manière dans tous les langues OO. Même certaines bases telles que l'héritage et les interfaces ont des variations, ne mentionnent pas des constructions plus floues telles que des traits/mélanges.

2
rob006

Les traits sont un accès statique dans PHP comme expliqué par Benjamin Eberlei sur son blog . Ils sont similaires à la pâte de copie automatisée du code.

Cela ne signifie pas que les traits sont absolument pervers, mais ils imposent la plupart du temps à des problèmes de couplage.

Le mélange en général est l'utilisation habituelle (un peu sûre) de multiples héritage. Languies à base de multiples héritages et par référencement (canard) typing comme Python Offrez des utilisations élégantes pour les mélanges.

0
abstrus