2016-06-29 17 views
6

I Gruppen von Logik, die von statischen Klassen bestehen, wie:Gruppierung statische Klassen mit dem gleichen Verhalten

static class A { 
    static int mutate(int i) { /**implementation*/ }; 
    static double prop(double a, double b) { /**implementation*/ }; 
} 

static class B { 
    static int mutate(int i) { /**implementation*/ }; 
    static double prop(double a, double b) { /**implementation*/ }; 
} 

In diesem Fall A und B sind statische Klassen, die das gleiche Verhaltens über eine Gruppe von Funktionen implementieren (zB mutieren). Ich möchte etwas wie eine Schnittstelle für dieses Muster verwenden, aber da statische Klassen keine Schnittstellen implementieren können, bin ich mir nicht sicher, was ich tun soll. Was ist der beste Weg, um diese Art von Verhalten sauber zu implementieren?

EDIT:

Hier ist ein Beispiel dessen, was ich derzeit tue. Die Klassen haben keinen Zustand, also würde ich sie normalerweise statisch machen.

Interface IMutator { 
    int mutate(int i); 
} 

class A : IMutator { 
    int mutate(int i) { /**implementation*/ }; 
} 

class B : IMutator { 
    int mutate(int i) { /**implementation*/ }; 
} 

class C { 
    public List<IMutator> Mutators; 
    public C(List<IMutator> mutators) { 
     Mutators = mutators; 
    } 
} 

//Somewhere else... 
//The new keyword for A and B is what really bothers me in this case. 
var Cinstance = new C(new List<IMutator>() {new A(), new B() /**...*/}); 
+1

gemacht Warum können Sie nicht verwenden, nicht-statische Klassen und Schnittstellen? Gibt es irgendeinen Grund, warum du auf Statik gehst? Was ist die Verwendung dieser Klassen? – dotnetom

+0

In diesen Klassen sind keine Daten vorhanden. Da es sich um reine Funktionsgruppen handelt, erscheint es seltsam, sie nicht statisch zu machen, da jede Instanz identisch wäre. Dies ist jedoch mein derzeitiger Ansatz. – shell

+1

Können Sie eine Beispielnutzung dieser Klassen bereitstellen? Wie viele ähnliche Klassen haben Sie? Nur diese 2, Dutzende, Hunderte? Es ist schwer, eine Alternative zu vorschlagen, wenn der Kontext nicht klar ist. – dotnetom

Antwort

5

Die zustandslose Klasse muss nicht statisch sein. Außerdem sind statische Abhängigkeiten keine gute Wahl, wenn Sie Komponententests schreiben möchten oder wenn Sie eine gemeinsame Schnittstelle extrahieren möchten (wie in Ihrem Fall).

Es ist in Ordnung, nicht-statische Klassen zu haben, die nur Logik enthalten. Z. B. bauen Leute ASP-.NET-Anwendungen unter Verwendung zustandsloser Controller auf.

Also, einfach static wegwerfen und eine Schnittstelle extrahieren.

+0

Bitte beachten Sie meine EDIT. Hast du das gemeint? Vielen Dank. – shell

+0

@shell: Ja, das habe ich gemeint. Sie können DI-Container verwenden, um 'IMutator'-Implementierungen in' C'-Instanzen zu injizieren (es geht um Ihre Belästigung). Ist das eine Art Plugin-basierte Anwendung? – Dennis

+0

Ich bin neu in C#, danke für die Hilfe. Ich werde DI ansehen. Sehr geschätzt. – shell

2

Neben @ Dennis Antwort (die I + 1'ed habe, und es ist in der Tat die Art und Weise zu gehen), anderer Ansatz, der eine Reihe von Funktionen, die arbeiten kann (Func<>) und/oder Aktionen (Action<>) und lösen sie durch Reflexion. Der Code wäre weder besonders elegant noch performant, aber er funktioniert.

Ich habe ein kurzes Beispiel on dotnetfiddle