将类作为参数链接的构造函数

问题描述:

有关使用类参数链接构造函数的问题。将类作为参数链接的构造函数

我有一个带有列表框的窗体。此表单用于调试目的。 当我将所有对象(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:“如果调用者为一系列可选参数中的任何一个提供参数,则它必须为所有前面的可选参数提供参数。”因此,如果我省略第一个可选参数,它将不起作用。我们必须说出这个名字:所以它*得到好的名字。

+3

'OtherClass'没有任何只有'ClassToPass'作为参数的构造函数。你能指望什么? – haim770

+0

它甚至没有任何构造函数,除了Form1以外,Form1应该如何绑定到ClassToPass?我有一种感觉,你想要制造某种可以处理所有*种不同类型的上帝对象。这是一个非常糟糕的主意,只能说明你在单一课堂上做得太多。 – HimBromBeere

+0

您的构造函数'OtherClass(int valuereceived):this(valuereceived,ClassToPass missingsomething)'无效 - 您无法定义这样的参数。 我不知道你在做什么。 –

您需要修改这些构造

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; 
     } 
    } 
+0

你好,它不适用于我的框架4.0?但是,谢谢 – Jablonovo

+0

嗨,这应该工作,因为我也使用.NET4.0。什么是错误? – ltiveron

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