2016-11-20 1 views
1

J'apprenais Clojure et je me demandais comment faire face aux sous-classes de type OO dans Clojure. Par exemple: une classe abstraite maître, deux sous-classes abstraites (chacune redéfinissant certaines fonctions) et au troisième niveau, des sous-classes finales qui créent des «objets» qui seront utilisés dans les fonctions. Aucune idée de comment faire cela. Cependant, j'ai réussi à le faire avec une classe abstraite à une classe enfant, avec defprotocol et defrecord. Mais je ne peux pas implémenter un protocole dans un autre. MerciSous-classes dans clojure

+1

Créez un protocole pour agir en tant que classe de base abstraite, puis définissez des protocoles qui représentent chaque nouveau "niveau". Les enregistrements peuvent implémenter plus d'un protocole, cela devrait donc fonctionner. – Carcigenicate

+0

Peut-être pertinent: http://clojure.org/reference/multimethods (surtout la partie que Clojure évite l'approche OO traditionnelle, mais vous pouvez réaliser le polymorphisme de différentes manières). –

+0

@Carcigenicate la chose est, j'ai besoin des enregistrements pour implémenter un seul protocole, ce qui apportera le protocole de base avec elle. Par exemple: J'ai 7 classes dans cet ordre: A> B A> C B -> D B-> E C> F C> G Et pour B et C dont ils ont besoin pour redéfinir certaines méthodes à partir de A – juanimoli

Répondre

6

Vous n'avez pas besoin de classes ou de sous-classes. Représentez vos données sous forme de cartes avec des attributs. Les "sous-classes" peuvent avoir plus d'attributs. Si vous avez une fonction qui varie selon l'attribut, utilisez une logique conditionnelle basée sur l'attribut (if, cond, etc.) ou utilisez un polymorphisme basé sur des multiméthodes ou des protocoles si vous en avez vraiment besoin.

Dans les mots de la matrice, il n'y a pas de cuillère.

+0

J'ai vraiment besoin de regarder des multiméthodes un de ces jours. J'écris Clojure depuis près d'un an maintenant et je n'ai pas encore touché à eux. – Carcigenicate

2

Vous pouvez faire de l'héritage avec des protocoles comme celui-ci:

(extend <subtype> 
    <protocol> 
    (merge (get-in <protocol> [:impls <basetype>]) 
     <map-of-redefined-methods>)) 

Multiméthodes fournissent un soutien direct à l'héritage avec derive.

Les relations de sous-classes Java réelles peuvent être spécifiées avec le mot-clé :extends à gen-class. Ceci est destiné exclusivement à Java interop, cependant.

Généralement, il est utile de vérifier si vous avez vraiment besoin d'héritage. Ce n'est généralement pas la méthode de modélisation préférée dans Clojure.