c#嵌套类和可见性?

时间:2010-11-30 09:36:33

标签: c# class combobox nested nested-class

我试图获得与组合框相同的功能,例如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();
}

原因是tags类调用传递给MyEditorClass的editorBox,如果你创建一个没有该编辑器的tags类,它将无法工作。

我的MyEditorClass看起来像这样:

public class MyEditorClass
{
    static RichTextBox editor;
    public TagClass Tags;

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



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

我试图让TagClass保持静态,但是没有用。组合框是如何构建的?由于您无法使用Combobox.Items,但如果您声明了一个,则可以在您声明的那个上使用Combobox.Items。

2 个答案:

答案 0 :(得分:1)

创建Tags属性readonly,然后只能在构造函数中初始化它:

public readonly TagClass Tags;

以后无法更改Tags中存储的对象引用和该代码:

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

不会编译。

或者,第二种可能性,甚至更好 - 仅为您的Tags属性公开公共getter,并将该实例私有保留在MyEditorClass类中,如下例所示。

顺便说一句,它不需要对嵌套类做任何事情。公共课内的公共课很奇怪。


修改 要使结构与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();

答案 1 :(得分:0)

在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);