C#构造函数问题

时间:2010-04-13 23:17:25

标签: c# .net c#-3.0

我有一个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值的赋值?

4 个答案:

答案 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)