2009-11-13 11 views
89

Ich war neugierig auf die Auswirkung, keinen expliziten primären Konstruktor in Scala zu haben, nur den Inhalt des Klassenkörpers.Privater und geschützter Konstruktor in Scala

Insbesondere vermute ich, dass das private oder geschützte Konstruktormuster, das heißt, die Konstruktion durch das Companion-Objekt oder die Methoden einer anderen Klasse oder eines anderen Objekts zu steuern, möglicherweise keine offensichtliche Implementierung hat.

Bin ich falsch? Wenn ja, wie wird es gemacht?

+0

Sie könnten eine Scala Singleton (mit dem Objektschlüsselwort, das ist), und definieren Sie Ihre Klasse als private innerhalb dieser Singleton und Methoden des Singleton zum Konstruieren Ihrer Objekte. – Paggas

+0

@Paggas, leider, wenn Sie eine Instanz einer Klasse zurückgeben, die als privat markiert ist, wird sie nicht kompiliert, selbst wenn sie von einer Methode zurückgegeben wird, die sich in ihrem Begleitobjekt befindet. –

+0

Dies ist im gesamten Scalaz-Quellcode ziemlich umfangreich. Das Konzept wird auch als * abstract * algebraischer Datentyp bezeichnet. –

Antwort

160

Sie den Standard-Konstruktor als privat deklarieren/geschützt durch das entsprechende Schlüsselwort zwischen dem Klassennamen eingefügt und der Parameterliste wie folgt aus:

class Foo private() { 
    /* class body goes here... */ 
} 
+0

Danke Aleksander, kannst du mir bitte sagen ob das in einem der Scalabücher oder in der Sprachspezifikation steht? Tut mir leid, ich kann noch nicht upvote. –

+0

Ich warf einen kurzen Blick auf die Programmierung von Scala (Seite 92-95) und ich sehe sie dort nicht erwähnt. Ich habe die Antwort auf deine Frage in einem alten Changelog gefunden, aber ich habe es noch nirgendwo anders erwähnt. Link: http://www.scala-lang.org/node/43#2.4.0 –

+13

Seite 414 von "Programmierung in Scala". Seite 97 von Wampler's Programmierskala. Seite 60 von Subramaniams Programmierskala. Ich habe gerade kein PDF von Beginning Scala bei mir, um es zu überprüfen. –

57

Aleksander ‚s Antwort richtig ist, aber Programming in Scala bietet eine zusätzliche alternativ:

+0

Das ist schlau, unnötig zu sagen, dass ich nicht' t erkennen, dass Merkmale als Ersatz für Klassen im Konstruktionsparadigma fungieren können. –

+0

In diesem speziellen Fall sind sie nur eine Schnittstelle. Obwohl du etwas Code hineinlegen könntest. Leider gibt es in meinem Beispiel einen Fehler, den ich gerade korrigiere ... –

+0

Ich habe dieser Technik nur ein bisschen nachgedacht. Das Merkmal muss die vollständige nicht-private Schnittstelle der erforderlichen Implementierung eines "Foo" vermitteln, aber als Gegenleistung für diese Einschränkung erhalten Sie viel Freiheit in der Art und Weise, wie Sie die Implementierung bereitstellen, während Sie mit dem Geist dessen, was angewendet wird, zurückkehren sollten. –

Verwandte Themen