2015-04-01 91 views
0

我有一個繼承自基類的類;它幾乎完全一樣,區別在於TypeParam有助於智能感知。我想提供一種將現有父類轉換爲子類的方法。可維護轉換

我目前做這種方式:

class A 
{ 
    public int f1; 
    public int f2; 
} 

class B<T> : A 
{ 
    public static B<T> Create(A a) 
    { 
     return new B<T> 
     { 
      f1 = a.f1; 
      f2 = a.f2; 
     }; 
    } 
} 

我擔心的是,這並不是一個很維護的解決方案,並且如果添加,但遺忘在創建新的方法字段或屬性可能會導致問題。我也想避免反射只是爲了複製一個對象。

有沒有更好的方法來實現這個目標?

+0

你在尋找mapper嗎? http://stackoverflow.com/questions/286294/object-to-object-mapper – 2015-04-01 15:35:09

+2

這不是鑄造,它的轉換。這兩者*非常*不同。你需要小心你的術語。 – Servy 2015-04-01 15:35:50

+0

@Servy編輯/修復 – TheCatWhisperer 2015-04-01 15:41:08

回答

3

典型的方法是在層次結構中的每個類中提供一個拷貝構造函數。例如:

class A 
{ 
    private int f1; 
    private int f2; 

    public A() 
    { 
     ... 
    } 

    public A(A original) 
    { 
     f1 = original.f1; 
     f2 = original.f2; 
    } 
} 

class B<T> : A 
{ 
    public B(A original) : base(original) 
    { 
    } 

    // Possibly overload with a B(B<T> original) as well? 
} 

這樣複製發生在聲明字段的類中。知道如何處理這些領域是最好的選擇;即使它們是私人的,它也絕對有訪問;當引入一個新字段時,只需對同一個類進行更改,而不是派生類。

它仍然有點難看,如果可能的話我會盡量避免 - 但這取決於上下文。 (有時候用構圖代替繼承是前進的方向,但這當然不是普遍的事實。)

+0

喬恩,這是一個更好的方法,就像你說的,更合適的地方是聲明對象。但是當添加一個新字段時,它仍然有可能遺忘的問題。 – TheCatWhisperer 2015-04-01 15:46:58

+1

@TheCatWhisperer:是的,它確實 - 這是我儘可能避免它的一個原因。你可以用巧妙的基於反射的單元測試來發現它,可能......但只要你謹慎地使用這個模式,就不應該太過刻意去處理它。 (也有基於反射的工具可以自動完成此操作,但它們是否適合您取決於您​​的上下文。) – 2015-04-01 15:47:57