2009-03-19 12 views
0

Ich habe eine Situation, die ich denke, ich brauche die Funktionalität von einer Schnittstelle und einer abstrakten Klasse zur Verfügung gestellt.Wie kann ich eine Klasse haben, die eine Schnittstelle implementiert und von einer abstrakten Klasse erbt? (C# .NET 3.5)

Ich erstelle Modelle, die in einer Simulation verwendet werden. Jedes Modell ist in einer C# -Klasse enthalten, die eine IModel-Schnittstelle (meines Entwurfs, so dass sie geändert werden kann) implementiert. Ich habe auch eine C++ - nicht verwaltete Win32-DLL erstellt, die als Brücke zwischen meinen C# -Modellklassen und der Simulationsumgebung fungiert. Die Modellklassen werden über COM aufgerufen, daher die Voraussetzung für eine Schnittstelle.

Ich habe gerade eine neue Anforderung erhalten, dass diese Modellklassen unabhängig von der Simulationsumgebung über einen Web-Service aufrufbar sein sollen. Jetzt sind diese Modelle ziemlich empfindlich, und der Client hat angefordert, dass sie vom Client konfiguriert und auf dem Server * ausgeführt werden. Ich dachte, dies wäre möglich, wenn ich die Modellklassen von einer abstrakten Klasse erben gemacht, erstellt dann eine Web-Service-Methode auf dem Server:

public AbstractModel executeModel(AbstractModel modelForExecution) 

, die ein Modellobjekt vom Client empfängt, führt sie aus und füllt es mit Ergebnisse.

ABER - Ich kann eine abstrakte Klasse nicht verwenden, da die Modelle eine Schnittstelle für die COM-Implementierung benötigen.

Wie kann ich diese beiden Anforderungen abstimmen? Mir wurde gesagt, dass es möglich ist, dass eine Klasse eine Schnittstelle implementiert UND diese Klasse von einer abstrakten Klasse ableitet, aber ich kann keine Beispiele dafür finden. Wenn es möglich ist, wie lautet die Syntax? Wenn es nicht möglich ist, was sollte ich sonst tun?

* Die Modellklassen nennen eigentlich eine alte Fortran-Datei, daher gibt die Modellkonfiguration der Klassen nicht zu viele Informationen darüber, wie das Modell funktioniert.

Antwort

5
public abstract class Base{} 
public interface IBase{} 
public Something: Base, IBase{} 
// the interface needs to go after the base class 
1

Ich würde versuchen, Ihre abstrakte Klasse implementieren die Schnittstelle (und haben die Methode als abstrakt). Dann unterwirft jede Implementierung nur die abstrakte Klasse. Ich denke, das sollte funktionieren.

Möglicherweise müssen Sie das Schlüsselwort 'overrides' für die Implementierungsmethode verwenden (der Compiler wird es Ihnen sagen).

+0

Das einzige Problem, das dabei auftreten kann, ist den Aufruf der abgeleiteten Klasse über COM von meiner nicht verwalteten Klasse. Es könnte funktionieren, aber ich denke, die andere Lösung ist an dieser Stelle einfacher. Vielen Dank für Ihre Antwort. – Alex

Verwandte Themen