Die ICloneableBenutzeroberfläche selbst ist nicht sehr nützlich, das heißt, es gibt wirklich nicht viele Situationen, in denen es nützlich ist zu wissen, dass ein Objekt klonbar ist, ohne etwas anderes darüber zu wissen. Dies ist eine ganz andere Situation als zB IEnumerableoder IDisposable; Es gibt viele Situationen, in denen es nützlich ist, eine zu akzeptieren, IEnumerableohne etwas anderes zu wissen, als sie aufzuzählen.
Andererseits ICloneablekann es nützlich sein, wenn es zusammen mit anderen Einschränkungen als generische Einschränkung angewendet wird. Beispielsweise könnte eine Basisklasse eine Reihe von Derivaten sinnvoll unterstützen, von denen einige sinnvoll geklont werden könnten und einige nicht. Wenn der Basistyp selbst eine öffentliche Klonschnittstelle verfügbar macht, verstößt jeder abgeleitete Typ, der nicht geklont werden kann, gegen das Liskov-Substitutionsprinzip. Um dieses Problem zu vermeiden, muss der Basistyp das Klonen mithilfe einer geschützten Methode unterstützen und abgeleiteten Typen ermöglichen, eine öffentliche Klonschnittstelle nach eigenem Ermessen zu implementieren.
Sobald dies erreicht ist, könnte eine Methode, die ein Objekt eines WonderfulBaseTyps akzeptieren möchte und in der Lage sein muss, es zu klonen, so codiert werden, dass sie ein WonderfulBase-Objekt akzeptiert, das das Klonen unterstützt (unter Verwendung eines generischen Typparameters mit Basistyp und ICloneableEinschränkungen). . Obwohl die ICloneableSchnittstelle selbst kein tiefes oder flaches Klonen WonderfulBaseanzeigen würde, würde die Dokumentation für angeben, ob das Klonen tief oder flach WonderfulBasegeklont werden sollte. Im Wesentlichen ICloneablewürde die Schnittstelle nichts erreichen, was durch Definieren nicht erreicht werden könnte ICloneableWonderfulBase, außer dass sie vermeiden müsste, unterschiedliche Namen für jede unterschiedliche klonbare Basisklasse zu definieren.