2011-09-08 32 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并删除常用方法。这是假设他们在同一个家庭...

相关问题