Warum sind die Mitglieder meines geschachtelten Companion-Objekts nicht automatisch in der Klasse sichtbar?

8

Angenommen, ich habe diesen Scala-Code:

%Vor%

Ich würde erwarten, dass dies kompiliert wird, aber auf B kann nicht über die Definition von b zugegriffen werden. Ich muss import Inner._ in class Inner hinzufügen, damit es funktioniert. Warum das? Ist das Begleitobjekt Inner nicht korrekt definiert?

    
Jean-Philippe Pellet 25.11.2010, 10:38
quelle

2 Antworten

6

Es sollte einfach nicht so funktionieren - die Verwendung von import Inner._ ist ein konsistentes Verhalten.

Im Allgemeinen wird ein Begleitobjekt benötigt, wenn Sie ein ähnliches Verhalten wie statische Member in Java erzielen möchten. Scala besteht darin, alle statischen Elemente in ein Singleton-Objekt zu verschieben, mit dem Vorteil, dass auf private / protected Mitglieder einer Companion-Klasse zugegriffen werden kann:

%Vor%

Sie können Companion-Objekt als Factory für die Klasse mit einem privaten Konstruktor verwenden:

%Vor%     
Vasil Remeniuk 25.11.2010, 10:58
quelle
11

Wenn die Mitglieder des Companion-Objekts in die Klasse importiert würden, würde dies den Namensraum der Klasse verunreinigen, ohne dass der Programmierer sie steuern könnte. Das ist vielleicht nicht so schlecht (aber immer noch schlecht) mit Werten, aber das möchte ich wirklich nicht mit Funktionen sehen.

Denken Sie nur an apply() oder Funktionen, die Sie von Traits erben (in beiden Fällen können Sie den Namen nicht einfach ändern, ohne etwas zu verlieren). Wenn diese Funktionen automatisch in den Namespace Ihrer Klassen importiert würden, wüsste der Compiler nicht, welcher verwendet werden soll. Wenn also die Klasse und das Objekt eine Funktion func() hätten, würden Sie in Ihrem Klassencode this.func() schreiben, nur um sicher zu gehen, welche Sie aufrufen.

Sehen Sie es als eine Möglichkeit an, Ihren Namensraum sauber zu halten. Sie können es dennoch mit import Inner._

verschmutzen     
Agl 25.11.2010 11:35
quelle

Tags und Links