簡體   English   中英

從ClassA轉換為ClassB的設計指南

[英]Design guidelines for converting from ClassA to ClassB

我剛剛開始研究一個大型的c#代碼庫。 代碼中的幾個類幾乎與其他類相同,這本身就是一個問題,需要進行轉換才能重用現有邏輯。

目前在代碼中存在散布的擴展方法,需要花費一些精力來查找並找出它們被調用以便使用它們。 我想將所有轉換方法移動到類中,以便可以非常容易地找到並使用它們。 但是,當您擁有所有內容的來源時,我不確定將一種數據類型轉換為另一種數據類型的最常用方法是什么。

為了將ClassA轉換為ClassB,我應該:

  1. 向ClassA添加一個方法,
  2. 創建一個ClassAHelper,
  3. 使用ClassA的擴展方法?

將一個類轉換為另一個類的代碼(我假設您正在討論運行時轉換)可能不是必要的方法。 例如,如果您有類X和類Y,每個類都有您希望從方法C調用的void Blah() ,並且方法C將X作為參數,那么您可能要做的是為X和Y提取一個公共接口然后讓C接受接口。 因此你的Y可以保持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 */ }

(此運算符需要在其中一種類型的源文件中聲明。)

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

為ClassB創建一個帶有ClassA對象的構造函數。

然后你可以這樣做:

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

這不是您的答案列表中的一個,但如果一個或兩個方法的所有內容都相同。 然后我會看看讓ClassB繼承ClassA並刪除常用方法。 這是假設他們在同一個家庭......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM