Ich habe eine Reihe von Schnittstellen, die in enger Verbindung mit bestimmten veränderbaren Objekt verwendet werden.C#: Schnittstelle Vererbung Getter/Setter
Viele Benutzer des Objekts benötigen nur die Fähigkeit, Werte aus dem Objekt und dann nur einige wenige Eigenschaften zu lesen. Um Namespace-Verschmutzungen zu vermeiden (leichtere Intellisense) und um die Verwendungsabsicht zu überwinden, hätte ich gerne eine kleine Basisschnittstelle, die nur einige "Schlüssel" -Eigenschaften schreibgeschützt verfügbar macht.
Fast alle Implementierungen unterstützen jedoch die vollständige Schnittstelle, einschließlich Modifizierbarkeit.
Leider lief ich in eine Straßensperre dieses Konzept in C# zum Ausdruck:
interface IBasicProps {
public int Priority { get; }
public string Name {get;}
//... whatever
}
interface IBasicPropsWriteable:IBasicProps {
public int Priority { set; } //warning CS0108: [...] hides inherited member [...]
public string Name { set; }
//... whatever
}
ich sicherlich keine Mitglieder zu verbergen beabsichtigte, so dass aint gut!
Natürlich kann ich das mit Methoden gut lösen, aber was ist die richtige Wahl? Ich möchte die "Kern" -Schnittstelle so klein wie möglich halten, selbst wenn das Aufteilen der Schnittstellen keinen anderen Zweck als die Absicht der Kommunikation erfüllt. Mit geteilten Schnittstellen ist es nur sehr offensichtlich, welche Methoden keine Aktualisierung durchführen werden, und es macht das Schreiben von Code ein wenig klarer (nicht zu vergessen, erlaubt auch nice-n-einfache statische Singleton-Stubs, die für einige einfache Fälle ausreichen) .
Ich möchte abstrakte Klassen und dergleichen vermeiden; Sie machen Reimplementierungen oder schnelle Einzweck-Shims, die komplexer und schwer zu ranken sind.
Also, Ideen?
Als Bonus funktioniert das auch gut mit Co/Kontravarianz; Mein tatsächlicher Anwendungsfall ist mehr wie 'IBasicProps {/*...*/} IBasicPropsWriteable : IBasicProps {}'. Hier ist die Schnittstellenaufteilung notwendig; Ein zentraler Manager möchte, dass die Kovarianz verschiedene Objekte in einer Sammlung ablegt, aber die einzelnen Besitzer jedes Objekts wissen, welchen Typ es enthält. –
Was denken Sie über das Auslassen des Getters auf der neuen Eigenschaft in der abgeleiteten Schnittstelle, wie hier vorgeschlagen? http: // Stapelüberlauf.com/questions/3516279/interface-vererbung-is-extending-properties-possible # comment3676924_3516450 –
Während dies wahrscheinlich die schlechteste Lösung in C# ist, ist es immer noch unbefriedigend, den "neuen" Modifikator zu verwenden, weil es bedeutet "es gibt ein nicht verwandte Eigenschaft desselben Namens, die alte Eigenschaft ist noch erhalten, benötigt jedoch eine komplexere Syntax für den Zugriff über 'IBasicPropsWriteable' ". Es wäre schön, wenn Sie die "selbe" Eigenschaft mit einem zusätzlichen Accessor erweitern könnten. (Das gleiche Problem tritt auf, wenn Klassen sich gegenseitig erben.) Mit Ihrer Lösung wird der Code 'static void M (IBasicPropsWriteable x) {var a = x.Name; var b = ((IBasicProps) x) .Name; } 'liest formell zwei verschiedene Mitglieder! –