Die ICloneable
Benutzeroberflä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 IEnumerable
oder IDisposable
; Es gibt viele Situationen, in denen es nützlich ist, eine zu akzeptieren, IEnumerable
ohne etwas anderes zu wissen, als sie aufzuzählen.
Andererseits ICloneable
kann 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 WonderfulBase
Typs 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 ICloneable
Einschränkungen). . Obwohl die ICloneable
Schnittstelle selbst kein tiefes oder flaches Klonen WonderfulBase
anzeigen würde, würde die Dokumentation für angeben, ob das Klonen tief oder flach WonderfulBase
geklont werden sollte. Im Wesentlichen ICloneable
wü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.