2010-05-08 19 views
2

je tendance à avoir cette appellation redondante en cas des classes:classes de cas Naming à Scala

abstract class MyTree 
case class MyTreeNode (...) 
case class MyTreeLeaf (...) 

est-il pas possible de définir et nœud feuille à l'intérieur de MonArborescence? Quelles sont les meilleures pratiques ici?

Répondre

4

Puisque les noms de classe, trait et objet sont package scope, pourquoi ne pas utiliser le package pour fournir une assurance contre aliasing avec d'autres nœuds et leafs et appelez-les simplement Node et Leaf, tout en les laissant à l'extérieur de toute autre construction de cadrage (c'est-à-dire, un objet)?

+0

Quelle est la différence entre un package et un objet compagnon? –

+1

Les objets de package sont des étendues pouvant contenir n'importe quel type d'entité Scala, en particulier celles qui ne peuvent pas vraiment apparaître au niveau supérieur/globalement en raison de restrictions JVM. Vous pouvez mettre les déclarations 'def',' val' (ou 'var') et' type' dans les objets du paquet mais seulement les traits, les classes et les objets au niveau supérieur. Les compagnons sont des paires classe/objet (qui partagent un nom) et qui sont définies dans le même fichier source. Les compagnons peuvent accéder aux membres privés de l'autre. –

2

Je ne recommanderais pas de placer les classes de cas dans leur superclasse abstraite car les classes imbriquées dépendent du chemin dans Scala. Si quelque chose, vous pourriez les mettre dans un objet compagnon.

abstract class MyTree 
object MyTree { 
    case class Node (...) extends MyTree 
    case class Leaf (...) extends MyTree 
} 

(Note: Je n'ai pas testé ...)