以 class 作为参数的构造函数链接

Constructor chaining with class as parameter

关于使用 Class 参数链接构造函数的问题。

我有一个带有列表框的表单。此表单用于调试目的。 当我实例化所有对象 (Class) 时,我希望他们在此列表框中写下发生的事情。 所以我将调试 class 作为参数传递给其他 class,这样每个人 (class) 现在谁是这个列表框。 我将带有委托回调的文本从每个 class 写入列表框调试。问题是其他人想调用我的 classes(不是调试器)并且他们想给我发送一个字符串。 所以我正在尝试使用链式构造函数,这样当我实例化我的 classes 时,调试器 class 在参数中,当他们调用我的 classes 时,他们使用字符串作为参数.

代码在那里:

public delegate void DEL_SetStringValCbk(string value);

public partial class Form1 : Form
{
    public  Debugger DebugConsole;
    internal OtherClass AnotherClass;
    internal OtherClass AnotherClassForString;
    public DEL_SetStringValCbk SetStringValCbk;
    private string MyTextToPass;
    public Form1()
    {
        InitializeComponent();
        MyTextToPass = "Hello world";

        DebugConsole = new Debugger();
        DebugConsole.Show();
        SetStringValCbk = new DEL_SetStringValCbk(DebugConsole.writeStr);
        SetStringValCbk("Object debugger done");
        AnotherClass = new OtherClass(DebugConsole);
        AnotherClassForString = new OtherClass(MyTextToPass);
        textBox1.Text = AnotherClassForString.TextReceived;
        textBox2.Text = AnotherClass.TextReceived;
    }
}

调试器:

public partial class Debugger : Form
{
    public Debugger()
    {
        InitializeComponent();
    }
    public void writeStr(string valuestr)
    {
        lb_debuglist.Items.Add(valuestr);
    }
}

其他Class 共享调试器列表框:

class OtherClass
{
    public string TextReceived = "none";
    public DEL_SetStringValCbk writeToDebug;
    Debugger DebuggerConsole;

    public OtherClass()//default ctor
    {}
    public OtherClass(string valuereceived): this(valuereceived, null)//only int ctor
    {}
    public OtherClass(Debugger _Debugger) : this("null", _Debugger) { }
    public OtherClass(string valuereceived, Debugger _Debugger)//master ctor
        : this()
    {
        TextReceived = valuereceived;
        if (_Debugger != null)
        {
            DebuggerConsole = _Debugger;
            writeToDebug = new DEL_SetStringValCbk(DebuggerConsole.writeStr);
            writeToDebug("class constructed init OK.");
        }
    }
}

对此有何评论?或者我可以将问题作为已回答的吗?

非常感谢代码工作者!

可选参数应该是:

class OtherClass
{
    public string TextReceived = "none";
    public DEL_SetStringValCbk writeToDebug;
    Debugger DebuggerConsole;

    public OtherClass()//default ctor
    {}
    public OtherClass(Debugger _Debugger = null,string valuereceived = "")//master ctor with default param
        : this()
    {
        TextReceived = valuereceived;
        if (_Debugger != null)
        {
            DebuggerConsole = _Debugger;
            writeToDebug = new DEL_SetStringValCbk(DebuggerConsole.writeStr);
            writeToDebug("class constructed init OK.");
        }
    }
}

如果我们在调用中分配名称(在 form1 中):

        AnotherClass = new OtherClass(_Debugger:DebugConsole);
        AnotherClassForString = new OtherClass(valuereceived:MyTextToPass);

为什么我们要分配这些?有帮助吗?

问题来了。来自 https://msdn.microsoft.com/en-us//library/dd264739.aspx:“如果调用者为一系列可选参数中的任何一个提供参数,则它必须为所有前面的可选参数提供参数。”因此,如果我省略第一个可选参数,它将不起作用。不得不放名字:所以被逼得要好的。

您应该使用可选参数。就像:

class OtherClass
 {
    int Numeral = 2;
    ClassToPass classtestinside;

    public OtherClass()//default ctor
    {}

    public OtherClass(int valuereceived = 0, ClassToPass _classtest = null)//master ctor
     : this()
    {
        Numeral = valuereceived;
        if(_classtest !=null)
        {               
            classtestinside = _classtest;
            classtestinside.num = 34;
        }
    }

您需要修改这些构造函数

    public class ClassToPass
    {
        public int num = 0;
    }

    class OtherClass
    {
        int Numeral = 2;
        ClassToPass classtestinside;

        public OtherClass()//default ctor
        {}

        public OtherClass(int valuereceived): this(valuereceived, null)//only int ctor
        {}

        public OtherClass( ClassToPass _Classtest)//classtopass ctor
        : this(0, _Classtest)
        {
        }
        public OtherClass(int valuereceived, ClassToPass _Classtest)//master ctor
            : this()
        {
            Numeral = valuereceived;
            if (_Classtest != null)
            {
                classtestinside = _Classtest;
                classtestinside.num = 34;
            }
        }
    }

问题来了。来自 https://msdn.microsoft.com/en-us//library/dd264739.aspx:“如果调用者为一系列可选参数中的任何一个提供参数,则它必须为所有前面的可选参数提供参数。”因此,如果我省略第一个可选参数,它将不起作用。不得不放名字:所以被逼得要好的。