2011-09-08 36 views
1

我剛開始在一個大型的c#代碼庫上工作。代碼中的幾個類與其他類幾乎相同,這本身就是一個問題,需要進行轉換才能重用現有的邏輯。從ClassA轉換到ClassB的設計指南

目前在代碼中有散佈的擴展方法,需要花費一些努力來查找並找出它們被調用以便使用它們。我想將所有的轉換方法移到類中,以便可以很容易地找到並使用它們。但是,我不確定什麼是當您擁有所有資源時將一種數據類型轉換爲另一種數據類型的最可接受的方式。

爲了ClassA的轉換爲ClassB的,我應該:

  1. 添加到ClassA的方法,
  2. 創建ClassAHelper,
  3. 使用ClassA的一種推廣方法?
+2

你能提供的這些類的2個例子嗎?我懷疑你可以從那些有很多共同點的基類中提取基類,並讓它們都從基類繼承。 – CodingWithSpike

回答

4

將一個類轉換爲另一個類(我假設你在談論運行時轉換)可能不是必要的方法。例如,如果您有要從方法C調用的每個都具有void Blah()的類X和類Y,並且方法C將X作爲參數,則您可能會做的是爲X和Y提取一個通用接口,然後C改爲接受界面。因此,你的Y可以保持Y.

另一種選擇是使用適配器模式它可以使Ÿ符合X的提取接口,這是特別有用,如果Y具有大致相同的功能,但使用不同的名稱,或者如果改變其中一個類的代碼是痛苦的,不可能的或者僅僅是不希望的。

一個例子,給出

interface ICanBlah { void Blah(); } 
class X : ICanBlah { public void Blah() { } } 
class Y { public void Blahhhhh() { } } 

你可以寫

public class YBlahAdapter : ICanBlah 
{ 
    Y itsY; 

    public YBlahAdapter(Y y) { itsY = y; } 
    public void Blah() { itsY.Blahhhhh(); } 
} 

因此,無論你有需要ICanBlah的方法,你有Y類型的對象,你可以在一個適配器把它包然後將適配器傳遞給該方法。另一方面,如果您確實想將X運行時轉換爲Y或將Y運行爲X,則可以爲其中一個或兩個定義隱式或顯式轉換運算符。

public static explicit operator Y(X x) { /* build and return Y from X */ } 

(此操作將需要的類型之一的源文件中聲明。)

0

您也可以嘗試另一種選擇:

創建ClassB的構造函數,它接受一個ClassA的對象。

然後,你可以這樣做:

ClassA foo = new ClassA(); 
ClassB bar = new ClassB(foo); 
0

這不是一個在你的答案的列表,但如果一切是一樣的exept一個或兩個方法。然後我會考慮讓ClassB繼承ClassA並刪除常用方法。這是假設他們在同一個家庭...

相關問題