Überlegen Sie, ob es üblich sein wird, Sammlungen von Objekten mit unterschiedlichen Kombinationen von Fähigkeiten zu haben, und ob Code möglicherweise eine Aktion für die Elemente innerhalb einer Sammlung ausführen möchte, die diese unterstützen . Wenn ja, und wenn es ein vernünftiges "Standardverhalten" für Objekte gibt, die für bestimmte Aktionen keine nützliche Unterstützung bieten, kann es hilfreich sein, Schnittstellen von einer Vielzahl von Klassen implementieren zu lassen, nicht nur von solchen, die sich nützlich verhalten können.
Nehmen wir zum Beispiel an, nur wenige Arten von Kreaturen können Woozles haben, und man möchte, dass solche Kreaturen eine NumerOfWoozles
Eigenschaft haben. Wenn eine solche Eigenschaft in einer Schnittstelle vorhanden wäre, die nur von Kreaturen implementiert wurde, die Woozles haben können, müsste der Code, der die Gesamtzahl der Woozles ermitteln möchte, die von einer Sammlung von Kreaturen gemischter Typen gehalten werden, etwa Folgendes sagen:
int total = 0;
foreach (object it in creatures)
{
IWoozleCountable w = trycast(it, IWoozleCountable);
if (w != null) total += w.WoozleCount;
}
Wenn jedoch WoozleCount ein Mitglied von Creature / ICreature wäre, könnte der Code wie folgt vereinfacht werden:
int total = 0;
foreach (ICreature it in creatures)
total += it.WoozleCount;
Während einige Leute auf der Idee scheuern könnten eine WoozleCount Eigenschaft jede Kreatur implementieren zu haben , die wirklich für einige Subtypen nur dann sinnvoll ist, würde die Eigenschaft sein sinnvoll für alle, auch nicht , dass es mit Gegenständen nützlich sein , bekannt diesen Typs zu sein, und ich würde die "Küchenspüle" -Schnittstelle als weniger nach Code riechend betrachten als den Trycast-Operator.
IEnumerable
,IEquatable
etc.