从Class转换为B类的设计指南

时间:2011-09-08 17:17:46

标签: c# design-patterns

我刚刚开始研究一个大型的c#代码库。代码中的几个类几乎与其他类相同,这本身就是一个问题,需要进行转换才能重用现有的逻辑。

目前在代码中存在散布的扩展方法,需要花费一些精力来查找并找出它们被调用以便使用它们。我想将所有转换方法移动到类中,以便可以非常容易地找到并使用它们。但是,当您拥有所有内容的来源时,我不确定将一种数据类型转换为另一种数据类型的最常用方法是什么。

为了将ClassA转换为ClassB,我应该:

  1. 向ClassA添加方法,
  2. 创建一个ClassAHelper,
  3. 对ClassA使用扩展方法?

3 个答案:

答案 0 :(得分:4)

将一个类转换为另一个类的代码(我假设您正在讨论运行时转换)可能不是必要的方法。例如,如果您有类X和类Y,每个类都有void Blah(),您希望从方法C调用,而方法C将X作为参数,您可能要做的是为X提取一个公共接口,然后让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 */ }

(此运算符需要在其中一种类型的源文件中声明。)

答案 1 :(得分:0)

您还可以尝试其他选项:

为ClassB创建一个带有ClassA对象的构造函数。

然后你可以这样做:

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

答案 2 :(得分:0)

这不是您的答案列表中的一个,但如果一个或两个方法的所有内容都相同。然后我会看看让ClassB继承ClassA并删除常用方法。这是假设他们属于同一个家庭......