Ich habe eine Schnittstelle, so dass Klassenschreiber bestimmte Methoden implementieren müssen. Ich möchte auch einige standardmäßig implementierte Methoden erlauben, also erstelle ich eine abstrakte Klasse. Das Problem ist, dass alle Klassen von der Basisklasse erben, also habe ich einige Hilfsfunktionen drin.
Ich habe versucht zu schreiben: IClass mit der abstrakten Basis, aber ich habe einen Fehler, dass die Basis das Interface nicht implementiert. Nun, natürlich, weil ich diese Zusammenfassung möchte und die Benutzer diese Methoden implementieren lassen. Als Rückgabeobjekt, wenn ich Base benutze, kann ich die Methoden der Interface-Klasse nicht aufrufen. Wenn ich die Schnittstelle verwende, kann ich nicht auf Basismethoden zugreifen.
Wie mache ich es so, dass ich diese Hilfsklassen haben und Benutzer zwingen kann, bestimmte Methoden zu implementieren?
Verschieben Sie die Interface-Methoden in die abstrakte Klasse und deklarieren Sie sie auch als abstrakt. Dadurch sind abgeleitete Klassen gezwungen, diese zu implementieren. Wenn Sie Standardverhalten verwenden möchten, verwenden Sie abstrakte Klassen. Wenn Sie nur die Signatur fixieren möchten, verwenden Sie eine Schnittstelle. Beide Konzepte vermischen sich nicht.
Nachdem ich in letzter Zeit mit dem gleichen Problem konfrontiert wurde, habe ich eine etwas elegantere (meiner Meinung nach) Lösung gefunden. Es sieht so aus:
%Vor% Nach C # spec (13.4.4. Interface mapping) wird der Compiler bei der Zuordnung von IInterface
auf Concrete
class nach CommonMethod
in CommonImpl
suchen und auch nicht t muss sogar virtuell in der Basisklasse sein!
Der andere wesentliche Vorteil gegenüber Mau's Lösung ist, dass Sie nicht jedes Interface-Mitglied in der abstrakten Basisklasse auflisten müssen.
Tags und Links c# inheritance interface