我有两种不同类型的节点,我需要能够以一种相对简单的方式在它们之间进行转换。我正在考虑在构造函数中执行此操作,因为这会使代码更简洁。
NodeA nodea = new NodeA();
NodeB nodeb = new NodeB.FromNodeA(nodea);
我已经搜寻了几个小时,却一直找不到解决方法。我想出的最好的解决方案是;
public NodeB() { }
public static NodeB FromNodeA(NodeA theNodeA)
{
NodeB b = new NodeB();
b.Value = theNodeA.value;
// etc..
}
但这使代码看起来更加时髦。
NodeB b = NodeB.FromNodeA(nodea);
理想情况下,我希望能够做到这一点:
NodeB b = new NodeB().FromNodeA(nodea);
编辑; 还是我已经完成了更多(传统上)正确方法的静态方法?
您可能只有一个带有NodeA
参数的构造函数:
NodeB nodeB = new NodeB(nodeA);
...但是使用工厂方法也是一种非常惯用的解决方案。它具有多种好处,包括能够使用名称不同但参数类型相同的多种方法-例如
TimeSpan.FromSeconds(...)
TimeSpan.FromMinutes(...)
这也使得该方法更灵活:
Encoding.GetEncoding
)使它成为构造函数的一个好处是,如果您有个的子类NodeB
,则可能会有一个构造函数,该构造函数也将NodeA
和链接到NodeB(NodeA)
构造函数。如果没有代码重复,使用工厂方法很难实现相同的目的。
根据亚历山德罗(Alessandro)的评论,您可以有一个用户定义的转换运算符,可以是显式的或隐式的。不过,对于隐式转换,我会非常小心-当时感觉很不错,但是最终导致了后来不清楚的代码。
最后,您也可以改用一个ToNodeB()
方法NodeA
-直接实现或作为扩展方法。
因此,将其汇总起来,以下是“用户代码”外观的选项:
NodeA nodeA = ...;
// One of...
NodeB nodeB = nodeA; // Implicit conversion
NodeB nodeB = (NodeB) nodeA; // Explicit conversion
NodeB nodeB = new NodeB(nodeA); // Constructor
NodeB nodeB = NodeB.FromNodeA(nodeA); // Factory method
NodeB nodeB = nodeA.ToNodeB(); // Instance or extension method on NodeA
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句