分配代码中的约定?

时间:2010-07-27 14:08:30

标签: c#

我有两个类,A和B. B知道A,而A不知道B.虽然A和B之间没有共享继承,但B具有可以很好地从A设置的属性。很多次我需要从A中分配B的属性,但我正在寻找关于我应该放置代码的指针。

public class A
{

}

public class B
{
    //constructor?
    public B(A a)
    {
        //set b's properties from a
    }

    //factory method?
    public static B FromA(A a)
    {
        B b = new B();
        //set b's properties from a
        return b;
    }

    //setter method?
    public static void SetBFromA(B b, A a)
    {
        //set b's properties from a
    }

    //assignment method?
    public void AssignFrom(A a)
    {
        //set b's properties from a
    }
}

//static helper class?
public static class BHelper
{
    public static B GetBFromA(A a)
    {
        B b = new B();
        //set b's properties from a
        return b;
    }

    public static void SetBFromA(B b, A a)
    {
        //set b's properties from a
    }
}

其中哪些是常见做法?根据他们的签名,他们中的任何一个都有影响吗?例如,使用构造函数通常会传达B是否持有对传入的A的引用?这些是我正在考虑的考虑因素。

谢谢!

4 个答案:

答案 0 :(得分:3)

我要么使用构造函数方法,要么使用显式转换。

public static explicit operator B(A typ) 
{

}

总的来说,我认为这是非常主观的。我们都可以用不同的方法发布答案,看看哪一个得到最多投票,但实际上每种方式都有不同的好处和不足。它更多地取决于上下文以及如何在整个代码中完成此模式。

答案 1 :(得分:3)

我会抛弃另一种选择:

public static B CreateFromA(A a) { }

这使用了工厂语法,建议你可以使B给出一个A,但要避免任何看似转换的内容。

答案 2 :(得分:2)

您提及的所有选项均有效。您可以选择哪种情况取决于具体情况。

 //constructor?
public B(A a)
{
    //set b's properties from a
}

如果没有来自A的数据,B不能存在,那么构造函数模式就是选择。

//factory method?
public static B FromA(A a)
{
    B b = new B();
    //set b's properties from a
    return b;
}

当B值得到的依赖于A或B中的值时,工厂方法将是选择模式。特别是如果B具有后代,则A中的值将提供构造选择。

//setter method?
public static void SetBFromA(B b, A a)
{
    //set b's properties from a
}

setter方法不适用于您的场景,因为当A和B不知道彼此并且第三方需要进行调解时会使用此方法。

//assignment method?
public void AssignFrom(A a)
{
    //set b's properties from a
}

这实际上是一种访客模式。访问B并留下一些东西(想想单身汉)。如果来自A的数据对于B是可选的,那么这将是选择的模式。

答案 3 :(得分:0)

我认为没有这样的常见做法。当我这样做时,我使用了工厂或构造函数方法。我可能更喜欢工厂。