Ich kann anscheinend keine Antwort darauf finden und möchte nur sicherstellen, dass es sich um einen in Ordnung befindlichen Codierungsstandard handelt. Ich habe eine Schnittstelle A
, die von vielen verschiedenen Klassen verwendet wird, und möchte nicht, dass sich die Schnittstelle A
ändert. Ich bin auf eine neue Anforderung gestoßen, die erfordert, dass viele der Klassen, die Interface implementieren A
, eine Aufzählung benötigen , aber nicht alle Klassen benötigen diese Aufzählung. Ich möchte nicht, dass die Klassen, die diese neue Aufzählung nicht benötigen, diese neue Funktionalität implementieren. Also habe ich eine Schnittstelle erstellt B
, die die neue Aufzählung enthält, die ich hinzufügen musste. Ich habe dann die Schnittstelle dazu gebracht, B
die Schnittstelle zu erben, A
und dies ist mein Anliegen. Ist es in Ordnung, wenn eine Schnittstelle eine andere Schnittstelle erbt ? Um mit meinen Änderungen fortzufahren, habe ich dann die Klassen geändert, die die neue Aufzählung zum Implementieren der Schnittstelle benötigtenB
anstelle der Schnittstelle, A
da sie von der Schnittstelle geerbt wurde B
. Ich habe darüber nachgedacht, beide Schnittstellen in meinen Klassen zu implementieren, die sie benötigen, aber ich verwende die Schnittstelle im gesamten Code und möchte nur eine Schnittstelle zum Durchsuchen von Klassen verwenden und nicht zwei.
Ich hoffe, das war klar genug (wahrscheinlich zu lang), aber wenn mir jemand einen Rat geben kann, entweder mache ich es richtig oder ich mache es falsch, lass es mich wissen.
Vielen Dank!
quelle
Überlegen Sie, ob die Schnittstellen logisch gekoppelt werden sollen, und verwenden Sie unbedingt die Vererbung, wenn Sie der Meinung sind, dass sie gut miteinander funktionieren.
Schauen wir uns ein Beispiel an.
public interface IScanner { void Scan(); } public interface IPrinter { void Print(); }
Drucker und Scanner sind häufig separate Objekte mit jeweils eigenen Funktionen. Diese beiden Geräte werden jedoch häufig auf demselben Gerät gekoppelt.
public interface IPhotocopier : IScanner, IPrinter { void Copy(); }
Es ist sinnvoll, dass IPhotocopier von IScanner und IPrinter erbt, da der Fotokopierer nun zusätzlich zu seiner primären Rolle als Kopierer entweder als Scanner oder als Drucker (den er enthält) verwendet werden kann.
Schauen wir uns nun eine weitere Schnittstelle an.
public interface IBlender { void Blend(); }
Es wäre nicht sinnvoll zuzulassen, dass IBlender von einer der früheren Schnittstellen geerbt wird (wie würden Sie sie nennen? IBlendingScanner?).
Wenn Sie Ihrer neuen Schnittstelle keinen sinnvollen Namen geben können, weist dies möglicherweise darauf hin, dass Sie in dieser Instanz möglicherweise keine Vererbung verwenden möchten.
Es ist eine schlechte Idee, einige Schnittstellen wie IDisposable zu erben, da dies alle Implementierungen Ihrer neuen Schnittstelle dazu zwingt, das Entsorgungsmuster zu implementieren, auch wenn sie keine verfügbaren Ressourcen haben.
quelle
Technisch gesehen erben Schnittstellen nicht voneinander. Was wirklich passiert, wenn Sie eine
IFoo
erben, von der erbtIBar
, sagen Sie, dass jede Klasse, die implementiert,IFoo
auch implementiert werden mussIBar
.interface IBar { void DoBar(); } interface IFoo : IBar { void DoFoo(); }
In diesem Beispiel verfügt die
IFoo
Schnittstelle über keineDoBar()
Methode. Meistens spielt die Unterscheidung keine Rolle, aber sie kann Sie beißen, wenn Sie die Reflexion auf einer Schnittstelle anstatt auf einer Klasse verwenden.quelle
Es ist sicherlich möglich, einen Vererbungsbaum von Schnittstellen und sogar eine "Mehrfachvererbung" mit Schnittstellen zu haben. Ob es das Richtige ist oder nicht, hängt von den jeweiligen Schnittstellen ab. Wenn es wirklich so ist, dass Schnittstelle B eine Erweiterung oder Verfeinerung von Schnittstelle A ist, dann ist Vererbung sinnvoll, aber wenn die neue Aufzählung weitgehend nichts mit dem von Schnittstelle A ausgedrückten Konzept zu tun hat, würde ich sie zu zwei separaten Schnittstellen machen und die Klassen haben das müssen beide Schnittstellen implementieren.
quelle
IMO das ist genau der richtige Ansatz, ich sehe kein Problem damit.
quelle
Ich denke, Datenbanken bieten immer eine großartige Möglichkeit, Schnittstellen zu demonstrieren. Wenn Sie also überlegen, ob eine Schnittstelle eine andere Schnittstelle erben soll, sehen Sie sich Folgendes an:
IMySqlDatabase : IDatabase MySqlDatabase : IMySqlDatabase IMsSqlDatabase : IDatabase MsSqlDatabase : IMsSqlDatabase
Eine MySqlDatabase ist eine IMySqlDatabase und eine IMySqlDatabase ist eine IDatabase.
Wenn Sie jetzt Änderungen an Ihrer IDatabase-Schnittstelle vornehmen müssen, können die Enkelkinder (die konkreten Datenbankklassen) die Vorteile nutzen, aber Sie müssen MySQL UND MsSQL (oder vielleicht sogar noch mehr DBMS-Schnittstellen) nicht erweitern. Gleichzeitig können Sie in Ihrem Middle Man (IMsSqlDatabase) weiterhin Schnittstellenfunktionen haben, die eine MySQL- oder Oracle-Datenbank nicht unterstützen würde.
quelle