Как исправить ошибку «недоступен из-за уровня защиты» в winform? - PullRequest
2 голосов
/ 22 марта 2012

У меня есть класс Form

    partial class ProgressMainForm : Form
    {
      public ProgressMainForm()
      {
        InitializeComponent();
      }
    }

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

    public class ProgressForm
    {
        public ProgressMainForm myProgressForm;

        public ProgressForm(string title)
        {
            myProgressForm = new ProgressMainForm();
            myProgressForm.Text = title;
        }

        public void SetProgressBar(int min, int max)
        {
        ....
    }

Затем я использую этот класс ProgressForm в своем проектевот так

            progresswindow = new ProgressForm("Replacing All Strings");

Таким образом progresswindow содержит только элементы, связанные с функциональностью ProgressForm, и все эти элементы формы скрыты от пользователя.

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

Есть ли способ сделать myProgressForm в ProgressForm доступным для пользователей, не делая ProgressMainForm общедоступным?

Или это неправильный подход?

Ответы [ 4 ]

2 голосов
/ 22 марта 2012

На мой взгляд, вы не должны работать с формой напрямую.Если я правильно прочитал ваши настройки, вы захотите показать индикатор прогресса во время выполнения какой-либо работы.ProgressForm должен предоставлять методы для установки счетчиков и их увеличения;когда вы запускаете его в другом потоке, манипуляции с формой должны выполняться изнутри методов ProgressForm.Ваши Invokes принадлежат там, завернутые в подходящие методы.Если вы хотите изменить некоторые визуальные свойства ProgressMainForm, переведите эти свойства в ProgressForm.

Чтобы возобновить, вызывающий код не должен понимать, что ProgressForm делает, кроме установки границ прогресса, запуска, установки текущего процента и остановки.Таким образом, если вас попросят перенести приложение в другую систему пользовательского интерфейса, количество кода, которое вам нужно будет изменить, будет резко сокращено.

2 голосов
/ 22 марта 2012

Есть ли способ сделать myProgressForm в ProgressForm доступным для пользователей, не делая ProgressMainForm общедоступным?

Да, на ProgressForm можно создать несколько общедоступных свойств, которые предоставляют конкретные свойства ProgressMainForm.

private ProgressMainForm myProgressForm;

public int SomeProperty
{
  get { return myProgressForm.IntProp; }
  set { myProgressForm.IntProp = value; }
}

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

2 голосов
/ 22 марта 2012

Оберните или раскройте методы, которые вам нужны.Но почему-то мне не нравится подход, ограничение доступа - не плохая идея, но не должно быть целью такого рода абстракции.Попробуйте сделать доступ проще, а не ограничивать.

0 голосов
/ 22 марта 2012

Вы можете объявить методы как внутренние , это позволит вам вызывать методы из сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...