2014-06-16 89 views
3

我需要定義一個執行淺拷貝的Clone()方法。 (沒有深層複製需要)memberwiseclone也會複製派生類中定義的成員嗎?

但我需要複製派生類的成員。

如果我有

class Base { 
    int baseMember; 
    public (virtual?) Base Clone() { 
     return (Base)this.MemberwiseClone() 
    } 
} 

那麼我應該得到所有其他類的clone()? 是否也將由Base.Clone()複製derivedMember?

class Derived { 
    int derivedMember; //will this also be copied by base.Clone()? 

    //Necessary? 
    public new Derived (override Base?) Clone() { 
     return (Derived)this.MemberwiseClone(); 
    } 
} 
+0

'無論您調用哪個函數,MemberwiseClone()'都是相同的函數。 – SLaks

+0

既然'Clone'返回'Base',它不會包含來自'Derived'的任何東西,可能會更好地實現'IClonable'並從你的克隆方法返回'object' –

回答

6

會衍生(非靜態)域調用基類this.MemberwiseClone()時也被複制?

是的,他們會因爲你可以通過編寫一個小測試這樣一個保證自己:

private static void Main(string[] args) 
{ 
    Student a = new Student() { Name = "John Doe", Id = 1 }; 
    Student b = (Student)a.Clone(); 
} 

public class Person 
{ 
    public string Name { get; set; } 

    public virtual Person Clone() 
    { 
     return (Person)this.MemberwiseClone(); 
    } 
} 

public class Student:Person 
{ 
    public int Id { get; set; } 
} 

而且這個問題已經answered here

是否需要覆蓋(或重寫)派生類中的Clone方法?

從技術上講,這不是必要的,但正如你看到你必須施放結果,因爲base.Clone()方法的返回類型是Person

或者你可以重寫你的基類Clone()方法是這樣的:

public T Clone<T>() where T:Person 
{ 
    return (T)this.MemberwiseClone(); 
} 

然後你需要調用

Student b = a.Clone<Student>(); 
你的派生類

。所以你只需要在基類中寫一次clone方法。雖然我不確定這是否是最佳解決方案。

相關問題