Mis*_*Nad 3 c# constructor overloading initialization initializer
我有两种不同类型的节点,我需要能够以相对简单的方式在它们之间进行转换.我正在考虑在构造函数中执行此操作,因为它会使代码更清晰.
NodeA nodea = new NodeA();
NodeB nodeb = new NodeB.FromNodeA(nodea);
Run Code Online (Sandbox Code Playgroud)
我一直在谷歌搜索几个小时,但未能找到办法做到这一点.我提出的最佳解决方案是;
public NodeB() { }
public static NodeB FromNodeA(NodeA theNodeA)
{
NodeB b = new NodeB();
b.Value = theNodeA.value;
// etc..
}
Run Code Online (Sandbox Code Playgroud)
但是这使代码看起来更像一个时髦的东西;
NodeB b = NodeB.FromNodeA(nodea);
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望能够这样做:
NodeB b = new NodeB().FromNodeA(nodea);
Run Code Online (Sandbox Code Playgroud)
编辑; 或者是静态方法我已经做了更多(传统上)正确的方法来完成这个?
你可以有一个带NodeA参数的构造函数:
NodeB nodeB = new NodeB(nodeA);
Run Code Online (Sandbox Code Playgroud)
...但是采用工厂方法也是一种非常惯用的解决方案.它具有各种好处,包括能够使用具有不同名称但具有相同参数类型的多个方法 - 例如
TimeSpan.FromSeconds(...)
TimeSpan.FromMinutes(...)
Run Code Online (Sandbox Code Playgroud)
这也使得该方法更灵活:
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
Run Code Online (Sandbox Code Playgroud)