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 IOrangewürde die Schnittstelle garantieren, dass Implementierer ihren Erben mindestens eine OrangePipsInstanz 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 protectedMitglieder 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 structs nicht funktionieren )
Ich kann nicht viel von einem Fall für privateoder internalModifikatoren in Schnittstellen sehen, aber die Unterstützung von beiden publicund protectedModifikatoren scheint vollkommen vernünftig.
Ich werde versuchen, die Nützlichkeit von protectedMitgliedern auf interfaces zu erklären, indem ich sie interfacevollständig von s trenne:
Stellen wir uns ein neues C # -Schlüsselwort vor, supportum 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 protectedMitglieder überhaupt erst zur Verfügung stellen.
Aber dann könnten wir auch folgendes tun:
public interface IOrange : IOrangeSupport
{
...
}
Dabei gilt dies IOrangeSupportfür alle Klassen IOrange, die bestimmte protectedMitglieder implementieren und von ihnen verlangen - was wir derzeit nicht tun können.

