2016-11-17 9 views
0

Вопрос о конструкторе цепочки с параметром класса.Цепь конструктора с классом как параметр

У меня есть форма со списком. Эта форма предназначена для отладки. Когда я внедряю весь свой объект (класс), я хочу, чтобы они записали в этом списке окно, что произошло. Итак, я передаю класс debug как параметр другому классу, чтобы теперь все (класс), кто является этим списком. Я передаю текст с обратным вызовом делегата для записи из каждого класса в debug. Проблема в том, что другие хотят вызывать мои классы (а не отладчик), и они хотят отправить мне строку. Итак, я пытаюсь использовать цепной конструктор, чтобы при инициализации моих классов был включен класс отладчика в параметре, и когда они вызывали мои классы, они делают со строкой в ​​качестве параметра.

Код есть:

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

Debugger:

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

OtherClass обмена отладчик ListBox:

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."); 
     } 
    } 
} 

Любые замечания по этому поводу? Или я могу поставить вопрос как ответ?

Огромное спасибо вам, кодоводам!

И с 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): этот (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

Здравствуйте, Это не работает для меня Framework 4.0? Но спасибо – Jablonovo

+0

Привет, это должно работать, так как я также использую .NET4.0. Какая ошибка? – ltiveron

0

Вот проблема. От https://msdn.microsoft.com/en-us//library/dd264739.aspx: «Если вызывающий объект предоставляет аргумент для любой последовательности дополнительных параметров, он должен предоставлять аргументы для всех предыдущих необязательных параметров». Поэтому, если я опускаю первый вариант, он не будет работать. Мы должны поставить имя: так что он вынужден получить хороший.

 Смежные вопросы

  • Нет связанных вопросов^_^