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?
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%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._