将类作为参数链接的构造函数
有关使用类参数链接构造函数的问题。将类作为参数链接的构造函数
我有一个带有列表框的窗体。此表单用于调试目的。 当我将所有对象(Class)实例化时,我希望他们在此列表框中写入发生的事情。 因此,我将调试类作为参数传递给其他类,以便每个人(类)现在谁是此列表框。 我使用委托回调将文本从每个类写入到列表框调试。问题是别人想要调用我的类(不是调试器),他们想给我一个字符串。 所以我试图使用链式构造函数,以便当我instanciate我的类与参数中的调试器类,当他们调用我的类他们做一个字符串作为参数。
代码有:
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);
}
}
OtherClass共享调试列表框:
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.");
}
}
}
对此有何评论?或者我可以将问题解答为答案?
非常感谢你的codeworker!
而且随着optionnal参数应该是:
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:“如果调用者为一系列可选参数中的任何一个提供参数,则它必须为所有前面的可选参数提供参数。”因此,如果我省略第一个可选参数,它将不起作用。我们必须说出这个名字:所以它*得到好的名字。
您需要修改这些构造
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;
}
}
}
您应该使用可选参数。这将是这样的:
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;
}
}
这是问题所在。来自https://msdn.microsoft.com/en-us//library/dd264739.aspx:“如果调用者为一系列可选参数中的任何一个提供参数,则它必须为所有前面的可选参数提供参数。”因此,如果我省略第一个可选参数,它将不起作用。我们必须说出这个名字:所以它*得到好的名字。
'OtherClass'没有任何只有'ClassToPass'作为参数的构造函数。你能指望什么? – haim770
它甚至没有任何构造函数,除了Form1以外,Form1应该如何绑定到ClassToPass?我有一种感觉,你想要制造某种可以处理所有*种不同类型的上帝对象。这是一个非常糟糕的主意,只能说明你在单一课堂上做得太多。 – HimBromBeere
您的构造函数'OtherClass(int valuereceived):this(valuereceived,ClassToPass missingsomething)'无效 - 您无法定义这样的参数。 我不知道你在做什么。 –