我有一个C#的构造函数问题。
我有这堂课:
public partial class Signature : Form, ISignature
{
private readonly SignatureMediator mediator;
public Signature(SignatureMediator mediator)
{
this.mediator = mediator;
InitializeComponent();
}
.... more stuff
}
我想像这样构建这个类:
public SignatureMediator(int someValue, int otherValue, int thirdValue)
: this(new Signature(this), someValue, otherValue, thirdValue)
// This is not allowed --^
{
// I don't see anyway to get this in to the ":this" part.
//Signature signature = new Signature(this);
}
public SignatureMediator(ISignature form, int someValue, int otherValue, int thirdValue)
{
SigForm = form;
SomeValue= someValue;
OtherValue= otherValue;
ThirdValue= thirdValue;
}
不允许: this( new SignatureThis(this)
(不允许在构造函数中使用this
。)
无论如何设置它而不重复int值的赋值?
答案 0 :(得分:4)
如果Signature
参数为this
,那么如果第二个构造函数从ISignature
构建null
,那么如何使用提供的ISignature
?然后,您可以从第一个构造函数传递null
以获得所需的行为。
public SignatureMediator(int someValue, int otherValue, int thirdValue)
: this(null, someValue, otherValue, thirdValue)
{
}
public SignatureMediator(ISignature form, int someValue, int otherValue, int thirdValue)
{
if (form == null)
{
SigForm = new Signature(this);
}
else
{
SigForm = form;
}
SomeValue = someValue;
OtherValue = otherValue;
ThirdValue = thirdValue;
}
答案 1 :(得分:2)
你绝对不能在构造函数链接调用中使用this
,所以你必须在构造函数的主体中调用它。最干净的方法是将常见的初始化代码提取到一个单独的方法中,如下所示:
public SignatureMediator(int someValue, int otherValue, int thirdValue)
{
Initialise(someValue, otherValue, thirdValue)
SigForm = new Signature(this);
}
public SignatureMediator(ISignature form, int someValue, int otherValue, int thirdValue)
{
Initialise(someValue, otherValue, thirdValue)
SigForm = form;
}
private void Initialise(int someValue, int otherValue, int thirdValue)
{
SomeValue= someValue;
OtherValue= otherValue;
ThirdValue= thirdValue;
}
如果构造一个Signature
对象非常便宜,你可以避免使用额外的方法,只需让第二个构造函数调用第一个,然后覆盖它使用传入值创建的SigForm值。
答案 2 :(得分:1)
我从来没有见过Mediator负责构建它介于中间的对象。如果是这样的话,它会将创造性的问题与调解相混淆,即使没有你的句法挑战,调解似乎也很难看。
为什么不以经典GoF模式建议的方式将调解员传递给签名?您的客户构建中介,然后将中介传递给中介介于其间的每个对象的构造函数。如果这太容易出错,可以使用Builder或工厂方法构建对象。
答案 3 :(得分:0)
由于未构造对象,因此不能将“this”作为参数调用。相反,你必须链接你的结构:
public SignatureMediator(int w, int x, int y, int z)
: this(x,y,z)