2016-10-29 3 views
1

ich so etwas wie den folgenden Code haben (ich es vereinfacht):Access-Bereich von Zug in Begleiter Objekt

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))) 
} 

Grundsätzlich erklärte ich eine konstante CONST_VALUE im Zug A. Ich versuche, es in dem Companion-Objekt B zu verwenden, um die Klasse B zu instanziieren. Ich kann jedoch nicht auf A.CONST_VALUE von dem Companion-Objekt B zugreifen. (Ich erhalte einen Kompilierungsfehler).

Also wie könnte ich das tun?

+1

Nebenbemerkung - Um eine Variable konstant zu machen, müssen Sie das Schlüsselwort 'final' hinzufügen:' final val CONST_VALUE = 10'. –

Antwort

2

Deklariere val CONST_VALUE = 10 innerhalb des Companion-Objekts A anstelle des Merkmals A. Auch korrigiert die apply Methodendefinition in Objekt 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))) 
} 
3

Sie können dies nicht tun.

Zunächst ist object B das Begleitobjekt zu class B, nicht zu trait A. Companions müssen denselben Namen haben und in derselben Compilierungseinheit definiert sein.

Zweitens ist ein Instanzfeld von trait A. Es ist Mitglied einer Instanz von A, kein Mitglied von A.

Drittens, wenn Sie A.CONST_VALUE sagen, rufen Sie im Grunde die Methode auf A. Sie können Methoden nur für Objekte/Werte aufrufen. A ist kein Objekt, es ist ein Typ, Typen und Werte leben in verschiedenen Welten, Sie können die beiden nicht mischen.

Und viertens, Ihre CONSTANT_VALUE ist irreführend benannt: nur final val s sind konstante Wertdefinitionen, so dass Ihre CONSTANT_VALUE ist eigentlich kein konstanter Wert.

Fünftens Ihre apply Methode nennt sich (B() ist syntaktischer Zucker für B.apply()) und benötigt somit einen Rückgabetyp Anmerkung.

Sechstens Ihre apply Methode nennt sich mit zwei Argumente, aber es ist mit nur ein Parameter definiert.

Siebte, erstellen Sie eine Array[Array[Byte]], aber es ist mir nicht klar, warum Sie das tun möchten und wofür Sie es brauchen.

Das ist ein ganzer truckload von Problemen (vor allem, da es nur eine Handvoll von Codezeilen zu beginnen), die Sie eins nach dem anderen beheben müssen. Hier ist eine mögliche teilweise Lösung, aber es ist mir nicht klar, was es ist genau, die Sie versuchen zu erreichen.

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))) 
}