Доступ к производному классу из вопроса объекта базового класса - PullRequest
1 голос
/ 03 августа 2010

У меня какая-то странная ситуация ...

У меня есть пользовательский элемент управления в WPF, к которому, в свою очередь, прикреплены некоторые другие пользовательские элементы управления, а затем у меня есть огромный файл кода C # с большим алгоритмом, который требует доступа к элементам и методам пользовательского интерфейса элемента управления, этот процесс работает с таймером, который отправляет данные в алгоритм файла кода C # из пользовательского элемента управления и должен возвращать и обновлять элементы пользовательского интерфейса из элемента управления, а также получать доступ к его методам ...

Теперь дело в том, что я не хочу помещать этот огромный алгоритм в файл codebehind моего элемента управления, вместо этого я хотел бы получить доступ к элементам пользовательского интерфейса элемента управления и объявленным методам из этого файла кода ...

Пока я пытался получить класс файла кода из пользовательского элемента управления, который я использую, это прекрасно работает, но для доступа к производному классу мне нужно создать его новый объект и пользовательский интерфейс, который мне показывают не обновляется, так как он также создает новый объект базового класса, я полагаю ...

поэтому у меня есть что-то вроде:

public partial class usrctrlSimulator : UserControl
{
    public usrctrlSimulator()
    {
        this.InitializeComponent();          
    }

    public void StartSimulator()
    {
        Algorithm = new csAlgorithm();

        Algorithm.InitializeSimulator();

        timer1.Start();
    }
}

public class csAlgorithm : usrctrlSimulator
{
    public csAlgorithm()
    {
    }

    public void InitializeSimulator()
    {
         txtblkSimulatorStatus.Text = "Started"; // this element would be from the user control
    }
}

Итак, мой вопрос: как мне вызвать производный класс, не создавая экземпляр его нового объекта, поскольку это приведет к созданию нового объекта пользовательского элемента управления, и отображаемый пользовательский интерфейс не будет обновлен ... или, если я не буду не выводит класс Algorithm, какая у меня есть возможность доступа к элементам и методам управления пользователя?

1 Ответ

0 голосов
/ 03 августа 2010

Если вы хотите придерживаться одного экземпляра элемента управления и по-прежнему иметь доступ к функциональности производного класса, вам необходимо использовать производный класс в качестве элемента управления. Поэтому вместо экземпляра usrctrlSimulator вы бы везде использовали csAlgorithm.

Однако я не уверен, является ли этот дизайн лучшим подходом в вашем сценарии. Алгоритм на самом деле не пользовательский элемент управления, поэтому, возможно, вывод из usrctrlSimulator не идеальный вариант. Например: UserControl имеет метод с именем ApplyTemplate(). Что бы это значило в csAlgorithm? Вы также можете посмотреть на это под другим углом: было бы разумно использовать csAlgorithm везде, где вы могли бы использовать UserControl, например, при вызове UserControl.AddLogicalChild(csAlgorithm)?

Другой вариант - создать экземпляр алгоритма в качестве переменной-члена в usrctrlSimulator (составной). В этом случае вы все равно можете использовать его внутри usrctrlSimulator, но у вас будет четкое разделение на две концепции: UserControl, с одной стороны, и реализация алгоритма, с другой. Кроме того, вы можете изменить любой из них, имея только ограниченное влияние на другой.

В этом случае ваш код будет выглядеть следующим образом:

public partial class usrctrlSimulator : UserControl
{
   public usrctrlSimulator()
   {
      this.InitializeComponent();          
   }

   public void StartSimulator()
   {
      _algorithm= new csAlgorithm();
      _algorithm.InitializeSimulator();
      timer1.Start();
   }

   private csAlgorithm _algorithm;
}

public class csAlgorithm // not a UserControl anymore
{
   public csAlgorithm()
      {
      }

   public void InitializeSimulator()
   {
      txtblkSimulatorStatus.Text = "Started"; // this element would be from the user control
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...