các ICloneable
giao diện của bản thân không phải là rất hữu ích, mà là để nói rằng có thực sự không có nhiều tình huống mà nó là hữu ích để biết rằng một đối tượng là cloneable mà không biết bất cứ điều gì khác về nó. Đây là một tình huống rất khác với ví dụ IEnumerable
hoặc IDisposable
; Có rất nhiều tình huống hữu ích khi chấp nhận một IEnumerable
mà không biết bất cứ điều gì khác ngoài cách liệt kê nó.
Mặt khác, ICloneable
có thể hữu ích khi được áp dụng như một ràng buộc chung cùng với các ràng buộc khác. Ví dụ, một lớp cơ sở có thể hỗ trợ một cách hữu ích một số dẫn xuất, một số trong số đó có thể được sao chép một cách hữu ích và một số thì không. Nếu bản thân kiểu cơ sở lộ ra giao diện sao chép công khai, thì bất kỳ kiểu phái sinh nào không thể được sao chép sẽ vi phạm Nguyên tắc thay thế Liskov. Cách để tránh vấn đề này là để kiểu cơ sở hỗ trợ sao chép bằng phương pháp được Bảo vệ và cho phép các kiểu dẫn xuất triển khai giao diện nhân bản công khai khi chúng thấy phù hợp.
Khi điều đó đã được hoàn thành, một phương thức muốn chấp nhận một đối tượng của một WonderfulBase
kiểu và cần có khả năng sao chép nó, có thể được mã hóa để chấp nhận một đối tượng WonderfulBase hỗ trợ sao chép (sử dụng một tham số kiểu chung với kiểu cơ sở và các ICloneable
ràng buộc) . Mặc dù ICloneable
bản thân giao diện sẽ không chỉ ra nhân bản sâu hay nông, nhưng tài liệu về WonderfulBase
sẽ cho biết liệu có WonderfulBase
thể nhân bản nên được nhân bản sâu hay nông. Về cơ bản, ICloneable
giao diện sẽ không thực hiện được bất kỳ điều gì không thể hoàn thành bằng cách xác định ICloneableWonderfulBase
, ngoại trừ việc nó sẽ tránh phải xác định các tên khác nhau cho mọi lớp cơ sở có thể nhân bản khác nhau.