ICloneable Vs强类型函数Vs懒惰

时间:2010-09-10 10:01:09

标签: .net icloneable

Hi Folks我需要深度克隆一些引用其他自定义对象的自定义对象,这些对象可能会引用其他自定义...等等,你就明白了。

我只是在文档&目前的概念阶段,所以不要把它弄好。

Q1。为什么在编写强类型自定义函数并返回克隆的正确对象类型时,实现ICloneable并返回一个对象?

Q2。对象不是很大,我不介意做最初的繁重复制每个元素,但是懒惰我可以成员克隆对象,然后再次为引用的成员添加特定代码,这将产生铸造的需要,所以更有效在cpu周期方面?

任何想法,意见和建议沉思欢迎。

3 个答案:

答案 0 :(得分:1)

有关不实施ICloneable的原因,请参阅536349;基本上你可以定义你自己的(强类型)界面并使用它,我没有看到任何问题,只要它正确记录它创建了深层副本。

答案 1 :(得分:0)

界面的目的是允许人们操作支持界面的对象,而不必担心对象实际上是什么。不知道iCloneable.Clone实际上会对任何给定对象做什么,只知道一个对象支持iCloneable是没用的。

集合类型有一个受保护的BaseClone方法是有用的,并且它们有一个派生类型可以使它公开(这样做可以让人们从集合中派生可克隆和不可克隆的类型)。像Dictionary支持一样克隆方法比包含复制构造函数更好,因为复制构造函数的参数可以是从Dictionary派生但在内部明显不同的类型。

要使克隆接口有用,它必须包含一个属性,通过该属性,项目可以说出他们对克隆的感受(例如-1-类型是不可变的,不需要克隆; -2-克隆类型可能会破坏它; -3-该类型支持克隆),并指定一个DeepClone操作将检查所有对象以确保他们不介意克隆,如果是这种情况,它将克隆所有嵌套的可变对象。不幸的是,框架中没有这样的东西。

答案 2 :(得分:0)

如果一组派生类型包括可克隆版本和不可克隆版本,则具有指示对象是可克隆的接口可能很有用。如果某种类型的衍生物可能无法支持克隆,那么该类型的克隆方法应该是受保护的;应该从中派生出类型的可克隆版本,但其他类型应该从非可克隆版本派生。

例如,可以有一个带有派生类型的Widget类型,包括CloneableWidget和SuperWidget(不可复制)。 SuperWidget可以有一个派生类型CloneableSuperWidget(以及其他一些在克隆时会中断的)。如果想要能够使用Widget类型的所有可克隆衍生物,则必须检查该对象是否来自Widget,并且它是可克隆的。将iCloneable添加到可克隆衍生物将允许人们检查这样的对象。