2016-10-29 2 views
1

In Scala, ich möchte eine abstrakte Klasse schaffen, die eine „Strategie“ Parameter (hier myBase) und einen Wert Parameter (hier myVal) akzeptiert. Ich möchte von dieser Klasse erben, den Strategieparameter als Teil der Vererbung bereitstellen und eine Klasse (hier Cls1) abrufen, die den Wert als Konstruktorparameter akzeptiert.Scala - schaffen Klasse, erben Teil Konstruktorparameter

Hier ist der Code, den ich will laufen können:

abstract class Base(myBase: Int)(val myVal: Int) { 
    val divVal: Int = myBase/myVal 
} 

class Cls1 extends Base(10) // myBase = 10 
val obj1 = new Cls1(5) // myVal = 5 
assert(obj1.divVal == 10/5) 

ich leider die folgenden Fehler,:

Error: too many arguments for constructor Cls1:()A$A58.this.Cls1 lazy val obj1 = new Cls1(5) Error: missing argument list for constructor Base in class Base class Cls1 extends Base(10)

Können Sie mir bitte erklären, wie kann ich dies zu erreichen, ohne die Logik zu wiederholen (hier myBase/myVal)?

Antwort

3

Sie können myVal erfordern ein abstraktes Feld zu sein, die von jeder inherting Klasse gefüllt werden muss:

abstract class Base(myBase: Int) { 
    val myVal: Int 
    val divVal: Int = myBase/myVal 
} 

class Clazz(val myVal: Int) extends Base(10) 

val clz = new Clazz(5) 
assert(clz.divVal == 10/5) 
Verwandte Themen