C#构造函数重载: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(例如,对于null输入)
  • 它可以返回对现有对象的引用
  • 它可以返回子类的实例(例如Encoding.GetEncoding
  • 您可以将方法组转换为委托,这对于LINQ操作非常方便(不需要lambda表达式)

使它成为构造函数的一个好处是,如果您有个的子类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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

重载的构造函数c#

来自分类Dev

C ++线程构造函数,使用new(object)创建内存泄漏

来自分类Dev

C# 构造函数重载无用的括号

来自分类Dev

在构造函数之后直接调用函数:new Object()-> callFunction()

来自分类Dev

在C#中编写多个构造函数重载的最佳方法

来自分类Dev

c#中构造函数重载和链接的区别

来自分类Dev

C ++重载异常的构造函数

来自分类Dev

New thread for each object in C#

来自分类Dev

如何在C#中的构造函数中使用重载函数

来自分类Dev

PowerShell:`New-Object`-ArgumentList` vs调用构造函数vs类型转换

来自分类Dev

将空值传递给C#中Object和String作为参数的重载方法

来自分类Dev

C#:为什么传递null会导致Object []重载(但仅在某些情况下)?

来自分类Dev

我可以在C#中调用相同类的重载构造函数吗?

来自分类Dev

如何安全地用枚举重载构造函数?C#

来自分类Dev

C#、. NET 4.5:XMLSerializer构造函数重载(“位置”)上的无法解释的参数

来自分类Dev

Java构造函数是否返回Object引用?

来自分类Dev

C#中new<object>(){}和new<object>{}实例化对象的区别

来自分类Dev

Powershell子类构造函数-找不到“ new”的重载

来自分类Dev

重载struct构造函数?

来自分类Dev

重载struct构造函数

来自分类Dev

空重载构造函数

来自分类Dev

调用重载的构造函数

来自分类Dev

构造函数重载python

来自分类Dev

构造函数重载的优点

来自分类Dev

链接重载的构造函数

来自分类Dev

C ++:基类的构造函数中的“字段'object_var'必须初始化”

来自分类Dev

C#中的构造函数

来自分类Dev

C#构造函数引用

来自分类Dev

jQuery函数返回[Object Object]

Related 相关文章

热门标签

归档