Schnelle Zugriffskontrolle auf Protokollkonformität

9

Ich habe ein privates Protokoll in einer Datei wie folgt definiert

%Vor%

Eine öffentliche Klasse entspricht dem obigen Protokoll wie folgt:

%Vor%

Gemäß der Apple-Dokumentation erhalten die Mitglieder einer öffentlichen Klasse standardmäßig eine interne Zugriffssteuerung, sofern sie nicht explizit auf einen anderen Zugriffskontrollmodifikator gesetzt ist.

Die Dokumentation besagt auch, dass die Konformität eines Typs mit einem Protokoll mit einer niedrigeren Zugriffssteuerung die Implementierung der Protokollzugriffssteuerung des Typs gleich der des Protokolls macht. Da in diesem Szenario die Zugriffssteuerung des Typs öffentlich ist und die Zugriffssteuerung des Protokolls privat ist, sollten die Methoden testfunc1 und testfunc2 eine Zugriffssteuerung von privat erhalten.

Wenn die Klasse in einer anderen Quelldatei instanziiert wird und auf die Methoden wie folgt zugegriffen wird, zeigt der Compiler keinen Fehler an, der nicht erwartet wird, da die Methoden gemäß den Richtlinien privat sein sollten.

%Vor%

Ist das erwartetes Verhalten? Fehle ich etwas?

    
Shalini Yadav 30.09.2015, 22:39
quelle

2 Antworten

4

Apple-Dokumentation sagt:

  

Wenn Sie einen Typ so schreiben oder erweitern, dass er einem Protokoll entspricht, müssen Sie sicherstellen, dass die Implementierung der einzelnen Protokollanforderungen des Typs mindestens die gleiche Zugriffsebene wie die Konformität des Typs mit diesem Protokoll aufweist.

Demnach gehe ich davon aus, dass die Implementierung der Methoden testFunc1 und testFunc2 mit einem anderen Zugriffskontrollmodifikator in testClass das Protokoll einfach überschreibt. Wenn Sie die Standardprotokollimplementierung dieser Methoden verwenden, gibt der folgende Compiler den folgenden Fehler zurück:

%Vor%

Soweit es sich bei Swift um eine protokollorientierte Sprache handelt, bei der die Vererbung durch Protokolle ersetzt wird, ist es wahrscheinlich sinnvoll, wenn Sie den protokolldefinierten Zugriff der Funktion innerhalb Ihrer benutzerdefinierten Klasse ändern möchten.

    
iyuna 01.10.2015 16:24
quelle
0

Laut Apples Dokumentation:

  

Wenn Sie einen Typ schreiben oder erweitern, um einem Protokoll zu entsprechen, müssen Sie sicherstellen, dass & gt; Die Implementierung jeder Protokollanforderung des Typs hat mindestens dieselbe & gt; Zugriffsebene als Übereinstimmung des Typs mit diesem Protokoll.

Bitte beachten Sie "mindestens" im Dokument. Dies bedeutet, dass die Zugriffsebene der Implementierung der Protokollanforderungen des Typs höher oder gleich die Zugriffsebene des Protokolls, wird es in Ordnung sein. In Ihrem Fall haben testFunc1 und testFunc2 von testClass die Standardzugriffsebene von intern, sie ist höher als die Zugriffsebene von privat. Die beiden Methoden in testClass erhalten also die Zugriffsebene von intern und der Compiler behandelt sie nicht als en-Fehler.

Wir können Ihren Code ein wenig wie folgt ändern:

%Vor%

}

Dieser Codeabschnitt wird auch ohne einen Fehler kompiliert.

    
Matthew An 24.05.2017 03:42
quelle