Ich habe den folgenden Code:
%Vor% In der Klasse Base
, wenn ich protected
mit this
beschrifte, funktioniert der Code wie erwartet; Wenn ich es nicht mit this
beschreibe, funktioniert alles wie erwartet.
Sind protected
und protected[this]
gleichwertig in Scala? Wenn ja, warum würde Scala beides bieten? Wenn nicht, wie unterscheiden sie sich?
Scala protected
und seine Geschwister protected[this]
, protected[pkg]
sind etwas überwältigend, aber ich fand die Lösung leicht zu merken, indem ich die Java Philosophie von protected
benutze.
1. Wie geschütztes Mitglied in Java sichtbar ist
Offensichtlich sind sie für die Klasse selbst sichtbar.
Aber Scala hat einige Einschränkungen, wie sie für die Unterklasse sichtbar sind. Standardmäßig sind sie nur für die Unterklasse sichtbar. Sie sind nicht sichtbar für das Paket, in dem die Klasse deklariert wird. Es gibt jedoch zwei Fälle, in denen sie in der Unterklasse sichtbar sind.
Wenn das geschützte Member nicht qualifiziert ist (plain protected), dann ist es sichtbar mit anderen Instanzen der deklarierenden Klasse in deklarierende Klasse sowie mit this
in Klasse und Unterklasse zB
wenn geschütztes Mitglied mit this
qualifiziert ist. Es ist nur mit this
in Klasse und Unterklasse erreichbar. Es kann nicht von anderen Instanzen der deklarierenden Klasse oder Unterklasse zugegriffen werden zB
Da Scala den Zugriff auf Paketebene des geschützten Members standardmäßig nicht unterstützt. Wenn Sie ihn jedoch auf Paketebene verfügbar machen möchten, müssen Sie das Paket explizit angeben, z. %Code%. Nun ist dieses geschützte Member sichtbar und deklariert Klassen / Subklassen-Instanzen, wenn auf sie in Klassen zugegriffen wird, die in pkg oder darunter deklariert sind.
z.B.
%Vor% So kann man sich Scala protected[pkg]
Der Unterschied besteht darin, dass die Unterklasseninstanz mit protected[this]
nur auf ihre eigenen Felder ( this.x
) zugreifen kann, während die Unterklasse mit protected
auf die Felder in allen Instanzen zugreifen kann (nicht nur in this
):
In diesem Code können Sie auf this.sayHello
, aber nicht auf other.sayHello
zugreifen. Die protected alpha
hat diese Einschränkung nicht.