Was ist das Argument gegen die Deklaration von Mitgliedern mit geschütztem Zugriff auf Schnittstellen? Dies ist beispielsweise ungültig:
public interface IOrange
{
public OrangePeel Peel { get; }
protected OrangePips Seeds { get; }
}
In diesem Beispiel IOrange
würde die Schnittstelle garantieren, dass Implementierer ihren Erben mindestens eine OrangePips
Instanz bereitstellen . Wenn der Implementierer wollte, konnte er den Umfang vollständig erweitern public
:
public class NavelOrange : IOrange
{
public OrangePeel Peel { get { return new OrangePeel(); } }
protected OrangePips Seeds { get { return null; } }
}
public class ValenciaOrange : IOrange
{
public OrangePeel Peel { get { return new OrangePeel(); } }
public OrangePips Seeds { get { return new OrangePips(6); } }
}
Die Absicht der protected
Mitglieder auf Schnittstellen besteht darin, einen Supportvertrag für Erben (Unterklassen) bereitzustellen , zum Beispiel:
public class SpecialNavelOrange : NavelOrange
{
...
// Having a seed value is useful to me.
OrangePips seeds = this.Seeds;
...
}
(Zugegeben, das würde bei struct
s nicht funktionieren )
Ich kann nicht viel von einem Fall für private
oder internal
Modifikatoren in Schnittstellen sehen, aber die Unterstützung von beiden public
und protected
Modifikatoren scheint vollkommen vernünftig.
Ich werde versuchen, die Nützlichkeit von protected
Mitgliedern auf interface
s zu erklären, indem ich sie interface
vollständig von s trenne:
Stellen wir uns ein neues C # -Schlüsselwort vor, support
um Erbverträge durchzusetzen, sodass wir die Dinge wie folgt deklarieren:
public support IOrangeSupport
{
OrangePips Seeds { get; }
}
Dies würde es uns ermöglichen, Klassen zu beauftragen, um ihren Erben geschützte Mitglieder zur Verfügung zu stellen:
public class NavelOrange : IOrange, IOrangeSupport
{
public OrangePeel Peel { get { return new OrangePeel(); } }
protected OrangePips Seeds { get { return null; } }
}
Dies ist nicht besonders nützlich, da Klassen diesen Vertrag bereits implizieren würden, indem sie die protected
Mitglieder überhaupt erst zur Verfügung stellen.
Aber dann könnten wir auch folgendes tun:
public interface IOrange : IOrangeSupport
{
...
}
Dabei gilt dies IOrangeSupport
für alle Klassen IOrange
, die bestimmte protected
Mitglieder implementieren und von ihnen verlangen - was wir derzeit nicht tun können.