我有两个类,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的引用?这些是我正在考虑的考虑因素。
谢谢!
答案 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)
我认为没有这样的常见做法。当我这样做时,我使用了工厂或构造函数方法。我可能更喜欢工厂。