2017-01-09 3 views
2

J'essaie de créer une liste d'objets de cas dans un objet compagnon. Les objets héritent tous d'une classe abstraite scellée. Mais le compilateur dit "non trouvé: valeur CompositeSpectrum" et ainsi de suite pour chaque élément de la liste. Les objets de classe et de cas scellés se compilent tous très bien, c'est juste quand j'essaie de faire apparaître dans la liste dans l'objet compagnon que j'obtiens des erreurs.Scala - Créer une liste d'objets de cas qui étendent une classe abstraite scellée

sealed abstract class Peculiarity(val abbreviation: String, val description: String) { 
    case object CompositeSpectrum extends Peculiarity("comp", "composite spectrum") 
    case object NebularFeaturesPresent extends Peculiarity("neb", "nebular features present") 
    case object ShellStar extends Peculiarity("sh", "shell star") 
    case object Uncertainty extends Peculiarity(":", "uncertainty") 
    case object VariableSpectralFeatures extends Peculiarity("var", "variable spectral features") 
    case object WeakFeatures extends Peculiarity("wl", "weak features") 
    case object VeryBroadAbsorptionFeatures extends Peculiarity("nn", "very broad absorption features") 
    case object BroadAbsorptionFeatures extends Peculiarity("n", "broad absorption features") 
    case object EmissionLinesPresent extends Peculiarity("e", "emission lines present") 
    case object NIIIandHEIIEmission extends Peculiarity("f", "NIII and HeII emission (O stars)") 
    case object EnhancedMetalFeatures extends Peculiarity("m", "enhanced metal features") 
    case object OtherPeculiarity extends Peculiarity("p", "other peculiarity") 
    case object VeryNarrowAbsorptionLines extends Peculiarity("s", "very narrow absorption lines") 
} 

object Peculiarity { 
    val peculiarities = List[Peculiarity](
     CompositeSpectrum, 
     NebularFeaturesPresent, 
     ShellStar, 
     Uncertainty, 
     VariableSpectralFeatures, 
     WeakFeatures, 
     VeryBroadAbsorptionFeatures, 
     BroadAbsorptionFeatures, 
     EmissionLinesPresent, 
     NIIIandHEIIEmission, 
     EnhancedMetalFeatures, 
     OtherPeculiarity, 
     VeryNarrowAbsorptionLines) 
} 
+0

Je dois mentionner que mon objectif ici est d'itérer sur la liste lors de l'exécution. J'aurai aussi besoin de modéliser, mais j'ai aussi besoin de parcourir la liste pendant l'analyse d'un fichier texte. –

Répondre

2

Parce que ces objets n'existent pas moins qu'ils sont référencés à partir d'une instance du type de Peculiarity parce qu'ils sont déclarés comme des objets internes à Peculiarity.

val pec = new Peculiarity("","") {} 
val peculiarities = List[Peculiarity](
    pec.CompositeSpectrum, 
    pec.NebularFeaturesPresent, 
    ... 

Mais je doute que ce que vous après, il vous suffit de déplacer la déclaration à l'extérieur de la classe abstraite

sealed abstract class Peculiarity(val abbreviation: String, val description: String) 
    case object CompositeSpectrum extends Peculiarity("comp", "composite spectrum") 
    case object NebularFeaturesPresent extends Peculiarity("neb", "nebular features present") 
    ... 

Et puis votre déclaration fonctionnerait très bien.

+2

Merci, les deux réponses étaient correctes, mais celle-ci explique pourquoi mon code ne fonctionnait pas aussi bien. –

1

Il n'est pas nécessaire d'imbriquer les case object dans la classe abstraite scellée.

Cela compile pour moi.

sealed abstract class Peculiarity(val abbreviation: String, val description: String) 
case object CompositeSpectrum extends Peculiarity("comp", "composite spectrum") 
case object NebularFeaturesPresent extends Peculiarity("neb", "nebular features present") 
case object ShellStar extends Peculiarity("sh", "shell star") 
case object Uncertainty extends Peculiarity(":", "uncertainty") 
case object VariableSpectralFeatures extends Peculiarity("var", "variable spectral features") 
case object WeakFeatures extends Peculiarity("wl", "weak features") 
case object VeryBroadAbsorptionFeatures extends Peculiarity("nn", "very broad absorption features") 
case object BroadAbsorptionFeatures extends Peculiarity("n", "broad absorption features") 
case object EmissionLinesPresent extends Peculiarity("e", "emission lines present") 
case object NIIIandHEIIEmission extends Peculiarity("f", "NIII and HeII emission (O stars)") 
case object EnhancedMetalFeatures extends Peculiarity("m", "enhanced metal features") 
case object OtherPeculiarity extends Peculiarity("p", "other peculiarity") 
case object VeryNarrowAbsorptionLines extends Peculiarity("s", "very narrow absorption lines") 

object Peculiarity { 
    val peculiarities = List[Peculiarity](
     CompositeSpectrum, 
     NebularFeaturesPresent, 
     ShellStar, 
     Uncertainty, 
     VariableSpectralFeatures, 
     WeakFeatures, 
     VeryBroadAbsorptionFeatures, 
     BroadAbsorptionFeatures, 
     EmissionLinesPresent, 
     NIIIandHEIIEmission, 
     EnhancedMetalFeatures, 
     OtherPeculiarity, 
     VeryNarrowAbsorptionLines) 
}