Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 难以回答的问题_C#_.net_Icloneable - Fatal编程技术网

C# 难以回答的问题

C# 难以回答的问题,c#,.net,icloneable,C#,.net,Icloneable,如果实现了一个类ICloneable,这意味着什么?基本上,它只允许克隆该类: 实现任何接口时,都需要定义该接口中的方法。在这种情况下,需要在类中定义Clone方法 来自Microsoft的示例: public object Clone() { return this.MemberwiseClone(); } 这只意味着类必须实现一个方法Clone,该方法返回一个对象,但不超过此值。因此,您可以拥有一个接受IClonable的方法,然后您可以克隆该对象。即拥有该方法的方法。文档中说,

如果实现了一个类
ICloneable
,这意味着什么?

基本上,它只允许克隆该类:

实现任何接口时,都需要定义该接口中的方法。在这种情况下,需要在类中定义Clone方法

来自Microsoft的示例:

public object Clone()
{
    return this.MemberwiseClone();
}

这只意味着类必须实现一个方法
Clone
,该方法返回一个对象,但不超过此值。因此,您可以拥有一个接受IClonable的方法,然后您可以克隆该对象。

即拥有该方法的方法。文档中说,该方法旨在克隆对象。文档特别指出,克隆可以是深的,也可以是浅的。还需要注意的是,生成的类型必须与克隆的对象具有相同的类型,但在类型系统中不能保证它实际上是相同的


总而言之,它没有提供太多硬性承诺,但其目的是创建独立的克隆。

ICloneable本身没有意义,但与其他约束条件结合使用可能有用(例如,可以规定参数必须是实现ICloneable的Foo)。因此,可以有一个Foo、一个CloneableFoo、一个AdvancedFoo和一个CloneableAdvancedFoo,允许将支持克隆的Foo派生与不支持克隆的Foo派生区别开来,但也允许期望可克隆的Foo接受可克隆的Foo派生的例程


不幸的是,虽然使用IClonable和Foo约束传递的函数参数可以用作IClonable和Foo,但如果没有类型转换,则无法创建符合此类条件的字段,也无法对字段进行类型转换。对此的一种补救方法是创建一个ICloneable(Of T为ICloneable(Of T)),其中包含一个返回T的“Clone”方法和一个也返回T的“Self”方法(因此,可以通过“Self”方法将包含“ICloneable Of Foo”的字段作为Foo访问)。要使这一切顺利进行,需要一点小心谨慎,但模式应该很好。

不幸的是,没有太多。你也可以在这里得到一点解释。请注意,这是
克隆的合法实现:
类Foo:iclonable{public int Value{get;private set;}public Foo(int Value){this.Value=Value;}public object Clone(){返回“Hello,World!”;}
接口对行为没有任何说明,它们只告诉您是否存在具有给定签名和返回类型的方法。其目的是该方法返回一个克隆(浅或深)或对象,但它不能保证这一点。仅仅因为类有一个名为
clone
的方法,并不意味着该方法在调用时克隆该类的实例。接口不是关于行为的承诺,它只是关于类上存在具有给定签名和返回类型的方法的承诺。第二句话的最后五个字是“然后你可以克隆该对象。”注意我的第一句话“仅仅因为类有一个名为
Clone
的方法,并不意味着该方法在调用时克隆类的实例。“我们中只有一个人是对的;
ICloneable
表示可以克隆该对象,也可以不克隆。我认为这只意味着可以在对象上调用名为
Clone
的方法,但不能保证它会生成克隆。参考我对OP的评论@Jason是的,我理解你的意思。我的第一句话涵盖了接口承诺的内容,第二句话涵盖了如果正确实现应该预期的内容。也许这不是clearNo,它只是说有一个名为
Clone
的方法不接受任何参数并返回
对象的实例
;当类实现接口时,定义接口中的方法是类的责任。