2 votes

Accéder à un champ à partir d'un trait dans un objet compagnon

J'ai quelque chose comme le code suivant (je l'ai simplifié) :

trait A {
  val CONST_VALUE = 10
}

class B(someValue: Int, values: Array[Int]) extends A {   
  //some methods
}

object B {
  def apply(someValue: Int) = B(someValue, Array.ofDim[Array[Byte]](someValue).map(block => Array.fill[Byte](A.CONST_VALUE)(0)))
}

En fait, j'ai déclaré une constante CONST_VALUE dans le trait A . J'essaie de l'utiliser dans l'objet compagnon. B pour instancier la classe B . Cependant, je ne peux pas accéder à A.CONST_VALUE de l'objet compagnon B (j'obtiens une erreur de compilation).

Alors, comment faire ?

4voto

Jörg W Mittag Points 153275

Vous ne pouvez pas faire cela.

Tout d'abord, object B est l'objet qui accompagne class B et non à trait A . Les compagnons doivent porter le même nom et être définis dans la même unité de compilation.

Deuxièmement, CONST_VALUE est un champ d'instance de trait A . Il est membre d'un instance de A qui n'est pas membre de A .

Troisièmement, lorsque vous dites A.CONST_VALUE vous appelez en fait la méthode CONST_VALUE sur A . Mais vous ne pouvez appeler des méthodes que sur des objets/valeurs. A n'est pas un objet, c'est un type Les types et les valeurs vivent dans des mondes différents, on ne peut pas mélanger les deux.

Et quatrièmement, votre CONSTANT_VALUE porte un nom trompeur : seul le final val sont des définitions de valeurs constantes, de sorte que votre CONSTANT_VALUE n'est pas une valeur constante.

Cinquièmement, votre apply s'appelle elle-même ( B() est un sucre syntaxique pour B.apply() ), et a donc besoin d'une annotation de type de retour.

Sixièmement, votre apply s'appelle elle-même avec deux mais il est défini avec seulement un paramètre.

Septièmement, vous créez un Array[Array[Byte]] mais je ne vois pas très bien pourquoi vous voulez faire cela et à quoi cela vous sert.

C'est tout un Chargement de camions Il y a beaucoup de problèmes (surtout si l'on considère qu'il n'y a qu'une poignée de lignes de code au départ), qu'il faut résoudre un par un. En voici un possible partiel solution, mais je ne vois pas très bien de quoi il s'agit exactement que vous essayez d'atteindre.

trait A

object A {
  final val CONST_VALUE = 10
}

class B(someValue: Int, values: Array[Int]) extends A {   
  //some methods
}

object B {
  def apply(someValue: Int): B = new B(
    someValue, 
    Array.ofDim[Array[Byte]](someValue).map(block => Array.fill[Byte](A.CONST_VALUE)(0)))
}

3voto

pamu Points 12013

Déclarer val CONST_VALUE = 10 à l'intérieur de l'objet compagnon A au lieu du trait A . A également été corrigé le apply définition d'une méthode dans un objet B

trait A {

}

object A {
  final val CONST_VALUE = 10
}

class B(someValue: Int, values: Array[Int]) extends A {   
  //some methods
}

object B {
  def apply(someValue: Int) = new B(someValue, Array.ofDim[Int](someValue).flatMap(block => Array.fill[Int](A.CONST_VALUE)(0)))
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X