Ich habe dieses Problem immer wieder. Angenommen, ich mache eine Befehlszeilenschnittstelle (Java oder C#, das Problem ist das gleiche ich denke, ich werde C# hier zeigen).
- Ich definiere eine Schnittstelle ICommand
- Ich erstelle eine abstrakte Basisklasse CommandBase, die ICommand implementiert, um gemeinsamen Code zu enthalten.
- Ich erstelle mehrere Implementierungsklassen, die jeweils die Basisklasse (und damit die Schnittstelle) erweitern.
Nehmen wir nun an, die Schnittstelle legt fest, dass alle Befehle die Eigenschaft Name und die Methode Execute implementieren...
Für Name muss jede meiner Instanzklassen einen String zurückgeben, der den Namen des Befehls darstellt. Dieser String ("HELP", "PRINT" usw.) ist statisch für die betreffende Klasse. Was ich gerne tun würde, ist zu definieren:
public abstract static const string Name;
Sie können jedoch (leider) keine statischen Mitglieder in einer Schnittstelle definieren.
Ich kämpfe schon seit Jahren mit diesem Problem (so ziemlich überall, wo ich eine Familie mit ähnlichen Klassen habe) und werde daher meine eigenen 3 möglichen Lösungen unten zur Abstimmung stellen. Da jedoch keine von ihnen ideal ist, hoffe ich, dass jemand eine elegantere Lösung posten wird.
UPDATE:
-
Ich kann die Formatierung des Codes nicht richtig einstellen (Safari/Mac?). Entschuldigung.
-
Das von mir verwendete Beispiel ist trivial. Im wirklichen Leben gibt es manchmal Dutzende von implementierenden Klassen und mehrere Felder dieses semistatischen Typs (d.h. statisch für die implementierende Klasse).
-
Ich vergaß zu erwähnen, dass ich diese Informationen idealerweise statisch abfragen können möchte:
string name = CommandHelp.Name;
2 der 3 von mir vorgeschlagenen Lösungen erfordern, dass die Klasse instanziiert wird, bevor man diese statischen Informationen herausfinden kann, was unschön ist.