我正在尝试链接构造函数。
public class Method1
{
public Method1(string a, string b) : this(a, b, "", "")
{
}
public Method1(string c, string d) : this("", "", c, d)
{
}
public Method1(string a, string b, string c, string d)
{
}
}
有什么方法可以实现这个目标吗?目前它显示编译时错误。
答案 0 :(得分:4)
这种事情的常见方法是拥有一个私有构造函数,它具有您需要的所有参数,然后编写一组命名良好的公共静态方法,使用适当的参数调用私有构造函数。
这是一个很好的方法,因为你可以为静态创建者方法提供合理的名称,而使用构造函数则不能(当然)。
例如:
public class Method1
{
public static Method1 Method1FromAB(string a, string b)
{
return new Method1(a, b, "", "");
}
public static Method1 Method1FromCD(string c, string d)
{
return new Method1("", "", c, d);
}
private Method1(string a, string b, string c, string d)
{
}
}
答案 1 :(得分:2)
您使用的是C#4,为什么不使用可选参数?
public Method1(string a = "", string b = "", string c = "", string d = "")
您可以将您想要的行为称为:
Method1(c: "some value", d: "some other value");
Method1(a: "some other other value", b:"another other value");
......或参数的任意组合。
答案 2 :(得分:1)
public Method1(string a, string b) : this(a, b, "", "")
和
public Method1(string c, string d) : this("", "", c, d)
具有相同的方法签名
您可以执行此操作,但不能使用与构造函数相同的方法签名
答案 3 :(得分:1)
public Method1(string a, string b) : this(a, b, "", "")
{
}
public static Method1 CreateMethodWithEndParams(string c, string d)
{
Method1 method = new Method1("", "", c, d);
return method;
}
public Method1(string a, string b, string c, string d)
{
}
你可以拥有这样的东西。当您想用c,d
创建对象时 Method1 method = Method1.CreateMethodWithEndParams("c", "d");
答案 4 :(得分:-1)
根据变量 a、b、c 和 d 代表的类型以及您如何使用它们,您可以为它们制作结构体。 然后你可以为构造函数创建重载,这样会更容易理解。
using System;
namespace ConstructorChaining
{
class Program
{
static void Main(string[] args)
{
var chainerAB = new ConstructorChainer(new A("aa"), new B("bb"));
Console.WriteLine($"chainerAB - A:{chainerAB.A.Value}, B:{chainerAB.B.Value}, C:{chainerAB.C.Value}, D:{chainerAB.D.Value}");
var chainerCD = new ConstructorChainer(new C("cc"), new D("dd"));
Console.WriteLine($"chainerCD - A:{chainerCD.A.Value}, B:{chainerCD.B.Value}, C:{chainerCD.C.Value}, D:{chainerCD.D.Value}");
}
}
public class ConstructorChainer
{
public A A { get; set; }
public B B { get; set; }
public C C { get; set; }
public D D { get; set; }
public ConstructorChainer(A a, B b) : this(a, b, new C(""), new D("")){}
public ConstructorChainer(C c, D d) : this(new A(""), new B(""), c, d){}
private ConstructorChainer(A a, B b, C c, D d)
{
A = a;
B = b;
C = c;
D = d;
}
}
public struct A
{
public A(string value)
{
Value = value;
}
public string Value{ get; set;}
}
public struct B
{
public B(string value)
{
Value = value;
}
public string Value{ get; set;}
}
public struct C
{
public C(string value)
{
Value = value;
}
public string Value{ get; set;}
}
public struct D
{
public D(string value)
{
Value = value;
}
public string Value{ get; set;}
}
}