Ich muss Überladungen für Funktionen an einer vorhandenen Schnittstelle erstellen, ohne die Komponenten zu beeinflussen, die die Schnittstelle derzeit implementieren oder verwenden (im Idealfall).Hinzufügen neuer Funktionen zu einer Schnittstelle
Ich denke, ich habe ein paar Optionen:
Simplified Original-Schnittstelle:
public interface IServerComponent
{
bool Add(int a, int b);
}
kann ich die neuen überladenen Funktionen zur Schnittstelle hinzufügen und jede Klasse erzwingen, die die Schnittstelle implementiert zu implementieren Sie die neuen Funktionen.
public interface IServerComponent
{
bool Add(int a, int b);
bool Add(int a, int b, int c);
}
Oder ich kann eine neue Schnittstelle erstellen, die die ursprüngliche Schnittstelle implementiert. Dann werden auch andere Klassen, die von der ursprünglichen machen müssen nicht ändern und keine neuen Klassen können die neue Schnittstelle implementieren ...
public interface IServerComponent2 : IServerComponent
{
bool Add(int a, int b, int c);
}
Was ist die beste Praxis ist diese Situation? Gibt es andere Optionen?
Dank
+1 für die Erwähnung Erweiterungsmethoden – ram
Erweiterungsmethoden funktionieren wird, aber haben auch die Wirkung, dass die Funktionalität der implementierenden Klasse in anderen Klassen Verbreitung reduziert Kohäsionskraft. Ich sehe das bestenfalls als vorübergehende Lösung. Wenn Sie die Klasse nicht erweitern können, weil Sie keinen Zugriff auf die Quelle haben, sind Erweiterungsmethoden sinnvoll. Ich könnte es auf diese Weise für kleinere Aktualisierungen einer bestehenden Codebasis tun, aber ich würde es sicherlich auf meine Refactoring-Liste für die nächste Hauptversion setzen. – tvanfosson
Das hängt ganz vom Design ab. Wenn Sie * neue Funktionalität * hinzufügen, würde ich zustimmen; Es gehört zu einer Schnittstelle. Wenn Sie * Überladungen * hinzufügen (z. B. fast identische Funktionalität, die immer mit anderen Funktionen ausgedrückt werden kann), stimme ich nicht zu. In diesem Fall erlauben Erweiterungsmethoden * Orthogonalität *, wodurch die Codeverdopplung reduziert wird. [Joe Duffy] (http://www.bluebytesoftware.com/blog/2010/02/10/ExtensionMethodsAsDefaultInterfaceMethodImplementations.aspx) hat einen guten Blogbeitrag zu diesem Thema. –