c # вложенность классов и видимость? - PullRequest
0 голосов
/ 30 ноября 2010

Я пытаюсь получить ту же функциональность, что и у выпадающего списка, например combobox1.Items.Add () // editor.Tags.Tags1 ()

Например:

class Main()
{
    // The editor is passed into the editor class, that allows the editor class to update the editor.
    MyEditorClass editor = new MyEditorClass(editorBox);
    editor.Tags.InsertTag1();

    // Now i don't want people to do this
    // MyEditorClass.TagClass tags = new MyEditorClass.TagClass();
}

Причина в том, что класс тегов вызывает editorBox, переданный в MyEditorClass, и если вы создадите класс тегов без этого редактора, он не будет работать.

Мой MyEditorClass выглядит так:

Я пытался сделать TagClass статичным, но это не сработало.Как устроен комбинированный список?Поскольку вы не можете использовать Combobox.Items, но если вы его объявите, вы можете использовать Combobox.Items для того, который вы объявили.

Ответы [ 2 ]

1 голос
/ 30 ноября 2010

Сделайте ваше Tags свойство readonly, тогда его можно инициализировать только в конструкторе:

public readonly TagClass Tags;

Ссылка на объект, сохраненная в Tags, не может быть изменена позже, и этот код:

MyEditorClass editor = new MyEditorClass(editorBox);
editor.Tags = new MyEditorClass.TagClass();

не скомпилируется.

Или, вторая возможность, даже лучше - предоставьте только публичный метод получения для вашего свойства Tags и держите экземпляр в секрете внутри вашего класса MyEditorClass, как в примере ниже.

Кстати, это не имеет ничего общего с вложенными классами. Довольно странно иметь публичный класс внутри публичного класса.


EDIT: Чтобы иметь структуру, аналогичную ComboBox, чтобы TagClass имел доступ к редактору, вы можете передать экземпляр редактора внутреннему конструктору TagClass. Конструктор является внутренним и не позволяет внешнему коду использовать TagClass напрямую.

public class MyEditorClass
{
    private readonly RichTextBox editor;
    private readonly TagClass tags;

    public TagClass Tags
    {
        get 
        {
            return tags; 
        } 
    }

    public MyEditorClass(RichTextBox editorBox)
    {
        editor = editorBox;
        tags = new TagClass(editorBox);
    }
}

public class TagClass
{
    private RichTextBox _editor;

    internal TagClass(RichTextBox editor)
    {
        _editor = editor;
    }

    public void InsertTag1()
    {
        _editor.Text += "Test tag 1";
    }
 }

И теперь это будет работать:

MyEditorClass editor = new MyEditorClass(editorBox);
editor.Tags.InsertTag1();
0 голосов
/ 30 ноября 2010

В классе TagClass добавьте член типа MyEditorClass и назначьте его при создании нового экземпляра TagClass:

public class TagClass
{
    private MyEditorClass editor = null;

    public TagClass(MyEditorClass parent)
    {
        this.editor = parent;
    }

    public void InsertTag1()
    {
        editor.Text += "Test tag 1";
    }
}

...

Tags = new TagClass(this);
...