C#Constructor重载:new object.FromOtherObject()?
我有两种不同类型的节点,我需要能够以相对简单的方式在它们之间进行转换.我正在考虑在构造函数中执行此操作,因为它会使代码更清晰.
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(...) 它还允许该方法更灵活: >在某些情况下它可能返回null(例如,对于空输入) 使它成为构造函数的一个好处是,如果你有一个NodeB的子类,那么它可以有一个构造函数,它也将NodeA和链带到NodeB(NodeA)构造函数.在没有代码重复的情况下使用工厂方法方法很难实现相同的功能. 根据Alessandro的评论,您可以拥有一个用户定义的转换运算符,无论是显式还是隐式.我会对隐式转换非常小心 – 当时它们可能感觉像个好主意,但最终会导致代码在以后不清楚. 最后,你也可以在NodeA上使用ToNodeB()方法 – 直接实现,或者作为扩展方法. 所以为了解决这个问题,以下是“用户代码”的外观选项: 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |