ICloneable сам по себе не имеет смысла, но может быть полезен в сочетании с другими ограничениями (например, можно предусмотреть, что параметр должен быть Foo, который реализует ICloneable).Таким образом, можно иметь Foo, CloneableFoo, AdvancedFoo и CloneableAdvancedFoo, что позволяет отличать производные Foo, поддерживающие клонирование, от тех, которые этого не делают, но также позволяет подпрограммам, которые ожидают, что клонируемый Foo принимает клонируемое производное Foo.
К сожалению, хотя параметр функции, переданный с ограничениями IClonable и Foo, может использоваться как IClonable и как Foo, без типов типов, нет никакого способа создать поле, удовлетворяющее этим критериям, и нет никакого способа типизироватьполе.Средством для этого может быть создание ICloneable (Of T As ICloneable (Of T)), который содержит метод «Клон», который возвращает T, и метод «Self», который также возвращает T (Таким образом, поле, содержащее «ICloneable Of Foo "может быть получен как Foo через метод" Self ").Для того, чтобы все это работало, нужно немного позаботиться, но шаблон должен быть довольно хорошим.