Unterschied zwischen geschützt und geschützt [this]

8

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?

    
optional 28.04.2016, 07:22
quelle

2 Antworten

9

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

  1. Sie sind für die Unterklasse sichtbar (die Unterklasse kann im selben Paket oder in einem anderen Paket enthalten sein)
  2. Sie sind für jede Klasse sichtbar, die sich im selben Paket befindet wie die Klasse, die das geschützte Element angegeben hat.

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

%Vor%

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

%Vor%

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]

merken     
optional 28.04.2016, 09:18
quelle
0

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 ):

%Vor%

In diesem Code können Sie auf this.sayHello , aber nicht auf other.sayHello zugreifen. Die protected alpha hat diese Einschränkung nicht.

    
Thilo 28.04.2016 07:47
quelle

Tags und Links