Ich habe eine .net-App, die einen Mechanismus zum Erweitern der App mit Plugins bietet. Jedes Plugin muss eine Plugin-Schnittstelle implementieren und darüber hinaus einen Konstruktor bereitstellen, der einen Parameter (einen Ressourcenkontext) erhält.Kann eine Schnittstelle die Signatur eines C# -Konstruktors definieren
Während der Instantiierung der Plugin-Klasse schaue ich über Reflektion, ob der benötigte Konstruktor existiert und falls ja, instantiiere ich die Klasse (via Reflection). Wenn der Konstruktor nicht existiert, werfe ich eine Ausnahme aus, die besagt, dass das Plugin nicht erstellt werden konnte, weil der gewünschte Konstruktor nicht verfügbar ist.
Meine Frage ist, ob es eine Möglichkeit gibt, die Signatur eines Konstruktors in der Plugin-Schnittstelle zu deklarieren, so dass jeder, der die Plugin-Schnittstelle implementiert, auch einen Konstruktor mit der gewünschten Signatur versehen muss. Dies würde die Erstellung von Plugins erleichtern.
Ich glaube nicht, dass eine solche Möglichkeit besteht, weil ich denke, ein solches Merkmal fällt nicht in den Hauptzweck für welche Schnittstellen für entworfen wurden, aber vielleicht kennt jemand eine Erklärung, dass dies der Fall ist, so etwas wie:
public interface IPlugin {
ctor(IResourceContext resourceContext);
int AnotherPluginFunction();
}
Ich möchte hinzufügen, dass ich den Konstruktor nicht als parameterless ändern und dann den Ressource-Kontext durch eine Eigenschaft festlegen, da dies die Erstellung von Plugins viel komplizierter macht. Die Personen, die Plugins schreiben, sind keine Personen mit tiefer Programmiererfahrung. Die Plugins werden verwendet, um statistische Daten zu berechnen, die von der App visualisiert werden.
Danke für alle Antworten.
Ich habe mich entschieden, dass es eine Schnittstelle sein soll, weil ich nicht möchte, dass die Plugin-Programmierer von einer abstrakten Klasse erben, so dass sie die Möglichkeit verliert, von einer eigenen Basisklasse zu erben . Darüber hinaus stellt das Ableiten von einer abstrakten Klasse nicht sicher, dass der Plugin-Programmierer den benötigten Konstruktor wirklich bereitstellt. Es macht es nur wahrscheinlicher (Der Programmierer hat immer noch die Möglichkeit, nur einen Konstruktor hinzuzufügen, der den gewünschten Parameter enthält, aber auch zusätzliche Parameter, und das ist auch schlecht. Siehe die Kommentare zur Antwort von Ken Browning).
Obwohl ich in meinem Beitrag erwähnte, dass ich solch eine Eigenschaft nicht will, habe ich die Antwort von Danny Varod als akzeptiert markiert, weil ich denke, in meiner Situation ist es die am besten geeignete Lösung. Danke an alle, die geantwortet haben.
+1 für die Verwendung einer Eigenschaft. –