2013-05-06 1 views
1

Pourquoi je ne peux pas accéder aux méthodes de classe de cas à l'intérieur de la méthode de classe ordinaire lorsque j'ouvre une instance de classe case sans mot-clé new? I.e. dans le code suivant, je reçois une erreur de compilation:Accès aux méthodes des classes de cas

case class A() { 
    private var _g = 12 

    //getter-setter 
    def g = _g 
    def g_=(value : Int) = this._g = value 
} 

class B { 
    def someMethod = { 
    val aInstance = A 
    aInstance.g = 4; // compile time error. Why? 
    } 
} 

Mais si j'ajoute new mot-clé dans aInstance déclaration de toutes les fins de travail.

message d'erreur:

Cannot resolve symbol g

+0

Deux choses: D'abord, donnez l'erreur exacte. Deuxièmement, pourquoi utiliseriez-vous une classe de cas dans ce cas? – gzm0

+0

@ gzm0 s'il vous plaît examiner la question mise à jour. J'ai remarqué que l'erreur de compilation se produit uniquement si je n'utilise pas le mot clé 'new' lors de la création d'une instance de classe de cas. Et à votre deuxième question: je ne sais pas pourquoi je ne peux pas utiliser la classe de cas dans ce contexte, je suis débutant dans Scala, donc j'écris ce code uniquement pour la formation – MyTitle

Répondre

3

Vous devez faire une instance de la classe A avec A() (qui appelle apply sur A). Sinon, vous faites référence à l'objet compagnon lui-même.

+0

merci, vous avez raison, maintenant tout fonctionne bien. Mais pourquoi dites-vous «vous faites référence à l'objet compagnon lui-même»? Je ne définis aucun objet compagnon à 'case class A' (c'est-à-dire que je n'ai aucun' object' avec le nom 'A' dans le même fichier source). Cela signifie que les objets Compagnon sont toujours définis implicitement (à moins que je ne le définisse explicitement)? – MyTitle

+0

Oui, une classe de cas vient toujours avec un objet compagnon. Si vous voulez ajouter des méthodes supplémentaires, vous pouvez le définir explicitement, mais la méthode 'apply' sera toujours prédéfinie. –

0

Comment cela? Vous n'avez pas défini f et signifiait probablement aInstance.

class B { 
    def someMethod = { 
    val aInstance = A 
    aInstance.g = 4 
    } 
} 
+0

C'est une faute de frappe dans ma question. Mis à jour – MyTitle

Questions connexes