Наследовать от «формы», которая имеет параметры - PullRequest
7 голосов
/ 20 апреля 2011

У меня есть форма с именем ScanFolder, и мне нужна другая форма, которая должна быть очень похожа на ScanFolder, поэтому я решил использовать наследование форм .Но, похоже, есть некоторое недопонимание с конструктором.

ScanFolder выглядит так:

public partial class ScanFolder : Form
{
    public ScanFolder(MainForm parent, bool[] autoModes, GlobalMethods GMethodsClass)
    {
        //Doing something with parameters
    }
}

Я пытался наследовать Form так:

public partial class Arch2 : ScanFolder
{
}

Но я получаю предупреждение Constructor по типу 'mhmm.ScanFolder' не найден, а также есть ошибка в Arch2 Режим редактирования формы, где я вижу ошибку стека вызовов.

Поэтому я попробовал что-то подобное:

public partial class Arch2 : ScanFolder
{
    public Arch2(MainForm parent, bool[] autoModes, GlobalMethods GMethodsClass)
        : base(parent, autoModes, GMethodsClass)
    {
    }
}

Но все по-прежнему.

Как вы можете видеть, я совершенно не представляю, что я делаю.Я пытаюсь добиться, чтобы Arch2 выглядел так же, как ScanFolder, поэтому я могу видеть его в представлении конструктора, а также переопределять некоторые методы или обработчики событий.

Ответы [ 2 ]

14 голосов
/ 20 апреля 2011

Чтобы использовать конструктор форм, вам понадобится конструктор без параметров:

public partial class ScanFolder : Form
{
    public ScanFolder()
    {
         InitializeComponent(); // added by VS
    }

    public ScanFolder(MainForm parent, bool[] autoModes, GlobalMethods gm)
       : this() // <-- important
    {
         // don't forget to call the parameterless ctor in each
         // of your ctor overloads
    }
}

Или, если вам действительно нужны некоторые параметры инициализации, вы можете сделать это наоборот:

public partial class ScanFolder : Form
{
    public ScanFolder()
        : this(null, new bool[0], new GlobalMethods())
    {

    }

    public ScanFolder(MainForm parent, bool[] autoModes, GlobalMethods gm)
    {
        InitializeComponent(); // added by VS
        // other stuff
    }
}

Я рекомендую первый подход, в противном случае вам нужно передать некоторые разумные параметры по умолчанию (я не рекомендую передавать нулевой параметр).

Похоже, что в некоторых случаях вам также придется перезапустить Visual Studio после изменения класса.

1 голос
/ 10 июля 2012

Вы можете использовать этот код в родительской форме:

public partial class ScanFolder : Form
{
 public ScanFolder(MainForm parent, bool[] autoModes, GlobalMethods GMethodsClass)
  {
    //doing something with parameters
  }
}

и затем в дочерней форме как:

public partial class ScanFolder : Form
{
  public ScanFolder(MainForm parent, bool[] autoModes, GlobalMethods GMethodsClass)
     : base(parent,autoModes,GMethodsClass)
  {
    //doing something with parameters
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...