Привязка объектов к элементам управления WinForms и модификаторам доступа - PullRequest
0 голосов
/ 23 февраля 2012

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

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

public class Foos : List<Foo>
{
}

public class Foo
{
    private int bar;
    public int Bar
    {
        get { return bar; }
        set { bar = value; }
    }
}

, затем привязываю его к DataGridView

public partial class Form1 : Form
{
    private Foos formFoos;

    public Form1()
    {
        InitializeComponent();

        formFoos = new Foos();
        AddFoo();

        dataGridView1.AutoGenerateColumns = true;
        dataGridView1.DataSource = formFoos;
    }

    /// <summary>
    /// generate some test values
    /// </summary>
    private void AddFoo()
    {
        for (int i = 1; i <= 5; i++)
        {
            Foo foo = new Foo();
            foo.Bar = 5 * i;
            formFoos.Add(foo);
        }
    }
}

Работает нормально.Но что, если я не хочу показывать Foo.Bar вне моей сборки?Если я сделаю это internal int Bar, я получу пустой dataGridView1.Если я сделаю это protected, я получу ошибку компилятора, потому что, конечно, Form1 не является производным от Foo.

Как элемент управления в форме в моей программе не соответствует определению internal ?

Внутренние элементы доступны только в файлах одной и той же сборки.

Общая мудрость относительно систематического представления этих объявлений также приветствуется.

1 Ответ

0 голосов
/ 24 февраля 2012

Вы должны пометить весь класс Foo как internal.
Таким образом, весь класс Foo и все его члены будут невидимыми вне сборки.

Form1.dataGridView1 необходимо, чтобы Foo.Bar было общедоступным, иначе он победит 'я не смогу им воспользоваться.
Теперь, поскольку Foo уже помечен internal, он может выставить Bar как public без риска выставить его вне сборки.

Это должно сделать как Form1.dataGridView1, так иВы одинаково счастливы.

  • Обратите внимание, что пометка Foo как internal, Foos также должна измениться с public на internal, поскольку Foos может не иметь более высокого доступауровень, чем класс, из которого он получен.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...