C 中Clone方法的鏈式複製實現

2021-09-01 03:31:55 字數 1506 閱讀 1490

大多數稍微有過一些程式設計實踐的c#初學者都應該聽說過「淺層複製」和「深層複製」的區別,如果尚不清楚的盆友還是先去搜尋一下相關的專題,我在這裡不多說,本文主要內容是記錄一下區別於前兩者的另外一種在有較複雜的類層次情況下的複製方式。

比如有如下類的宣告:(**1)

public class classone

public class classtwo : icloneable

}

即第二個類將第乙個類作為私有成員進行封裝。此時若直接呼叫classtwo物件的clone()方法則實際上是進行了classtwo的淺層複製。

如果想通過clone()方法進行深層複製,則需要進行如下修改:(**2)

public class classone

public class classtwo : icloneable

}

寫到這裡這兩個類的確已經相安無事了。然而事情沒這麼簡單,接下來如果從classtwo派生出乙個子類classthree如下:(**3)

public class classthree : classtwo

此時如果想要通過clone()對classthree進行深層複製該如何做呢?有些和我之前一樣小白的盆友們會立刻想到如下修改該方式:(**4)

public class classthree : classtwo, icloneable

}

稍微有些經驗的盆友馬上就會發現,這樣的修改並不能正確的實現深層複製的目的,因為classtwo中的成員classtwo.one是private的,無法直接訪問,而this.memberwiseclone()方法只會將其進行淺層複製。

於是馬上就能想到的另一種修改方法如下:(**5)

public class classthree : classtwo, icloneable

}

看似完成了需求,但實際上這次的修改根本無法便已成功,原因出在第9行**,因為classthree.key是唯讀的,無法在建構函式以外的方法中對齊進行賦值。

**4和**5的思路都不對,豈不是進入死胡同了?其實不然,經過我的簡單試驗發現只要刪除**4中的第9行就可以完美的實現我們的深層複製需求,完整**如下:(**6)

public class classone

public class classtwo : icloneable }

public class classthree : classtwo, icloneable

}

其實原因很簡單,在執行**6中第26行時,.net框架首先執行了其父類的clone()方法,在本例中則是實現了對父類的深層複製,接下來是隱式的對當前類中的除父類中以外的非靜態成員進行了淺層複製,即.net框架已經悄悄的幫我們完成了clone.key = this.key的操作,真相大白,功德圓滿。

總結,在執行base.clone()的實際操作可分解為:首先執行了其父類的clone()方法,然後隱式的對當前類中的除父類中以外的非靜態成員進行了淺層複製,最後返回型別與this相同的經過鏈式複製新物件。

Java中的clone方法

1.功能 由方法名 轉殖 可知是複製乙個物件,方法呼叫後會建立並返回此物件的乙個副本。2.為什麼不用 以賦值的方式建立物件副本?student stu1 new student zhaoliu 18,1996 11 20 student stu2 stu1 stu2.setname lisi sys...

java中的clone 方法詳解

test public void testassign test public void testshallowcopy throws exception如果是基本資料型別的成員變數,我們轉殖之後彼此的屬性是可以相互不影響的,接著看 如果增加乙個自定義的類物件時 data public class ...

Object類中clone 的使用方法

我們先看兩個圖 圖1 圖2由以上兩個圖,我們可以知道,要想使用clone 方法需要先implements cloneable介面 該介面是標記介面,也就意味著必須打上轉殖的標識你才能進行轉殖 再看圖2 object類中方法名前加protected意味著只有其子類才能訪問,其他類訪問需要子類重寫該方法...