2016-11-17 74 views
0

有關使用類參數鏈接構造函數的問題。將類作爲參數鏈接的構造函數

我有一個帶有列表框的窗體。此表單用於調試目的。 當我將所有對象(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)'無效 - 您無法定義這樣的參數。 我不知道你在做什麼。 –

回答

0

您需要修改這些構造

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

您應該使用可選參數。這將是這樣的:

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

0

這是問題所在。來自https://msdn.microsoft.com/en-us//library/dd264739.aspx:「如果調用者爲一系列可選參數中的任何一個提供參數,則它必須爲所有前面的可選參數提供參數。」因此,如果我省略第一個可選參數,它將不起作用。我們必須說出這個名字:所以它被迫得到好的名字。

相關問題