2015-05-19 6 views
8

Ich habe eine abstrakte Klasse mit einem Standardwert für seinen Parameter. Ich möchte nicht den Standardwert im Konstruktor aller möglichen Implementierungen verwenden müssen.Scala Vererbung Standardparameter in der übergeordneten Klasse

abstract class Place(val place: String = "World") 
class Message(val message: String = "Hello", p: String) extends Place(p) { 
    override def toString = s"$message $place" 
} 

Was will ich

new Message("Hi", "Universe") = "Hi Universe" // Ok 
new Message("Hi") = "Hi World" // Doesn't work, second parameter is required 
new Message() = "Hello World" // Doesn't work, second parameter is required 

hielt ich bekommen einen Hilfs Konstruktor mit dem zweiten Parameter weggelassen, aber es hilft nicht, da Sie nicht super Bauer außerhalb des Haupt Konstruktor aufrufen können.

Ich möchte wissen, wie es geht, oder warum es nicht möglich ist. Ich bin nicht auf der Suche nach einer Problemumgehung, wie keine Vererbung verwenden.

Antwort

1

Sie können den Standardwert in eine elegantere Art und Weise wiederverwenden:

object Place { 
    val defaultPlace = "World" 
} 
abstract class Place(val place: String = Place.defaultPlace) 
class Message(val message: String = "Hello", p: String = Place.defaultPlace) extends Place(p) { 
    override def toString = s"$message $place" 
} 
+0

funktioniert. nicht so gekapselt. Hier haben Sie 3 Objekte zum Jonglieren (Objekt, Abstract und Klasse). Insbesondere keine Gutschrift für Objekt und Abstrakt mit gleichem Namen. Klasse Nachricht muss über Objekt Ort wissen, so dass die Verwendung mehr Verdrahtung benötigt, wenn das Sinn macht. das Abstrakte und Konkrete sollte mit allem umgehen. – Drew

3

Ich fürchte, das ist nicht möglich. Ganz einfach, Sie übergeben einen Wert an den Place-Konstruktor, damit er nicht den Standardwert verwendet, wie auch immer sein Wert sein mag. Wenn Sie nichts dagegen keine var anstelle eines val mit, hier ist eine Variante, die für Ihre 3 Fällen funktioniert:

abstract class Place(var place: String = "World") 
class Message(val message: String = "Hello") extends Place() 
{ 
    def this(message: String, place: String) = { 
     this(message) 
     this.place = place 
    } 
    override def toString = s"$message $place" 
} 

Konstrukteurs in Scala sind ein wenig ein Durcheinander IMHO. Manchmal ist eine bessere Antwort nur, um die Methoden apply() auf einem Companion-Objekt zu verwenden, die flexibler sind.