abstrakte Klasse implementiert keine Schnittstelle

9

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?

    
Null 11.07.2010, 15:26
quelle

3 Antworten

6

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.

    
Femaref 11.07.2010, 15:30
quelle
15

Stellen Sie sicher, dass Methoden in der Basisklasse denselben Namen wie die Schnittstelle haben und öffentlich sind. Machen Sie sie auch virtuell, damit Unterklassen sie außer Kraft setzen können, ohne sie zu verbergen.

%Vor%     
Mau 11.07.2010 15:31
quelle
0

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.

    
vines 09.03.2012 22:52
quelle

Tags und Links