2010-11-30 77 views
0

我想获得一个组合框也像combobox1.Items.Add()// editor.Tags.Tags1()c#嵌套类和可见性?

像这样相同的功能:

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(); 
} 

的原因是,标签类调用传递给MyEditorClass的editorBox,如果你创建一个没有该编辑器的标签类,它将不起作用。

我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。

回答

1

让您Tags财产readonly,那么可以仅在构造函数初始化:

public readonly TagClass Tags; 

存储在Tags的对象引用不能被改变以后再和该代码:

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

不会编译。

或者,第二种可能性,甚至更好 - 只为您的Tags属性公开获取公开获取者,并将该实例私有保存在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(); 
+0

问题是,我没有想法如何建立我的班级以反映组合框架。 (tagsclass也必须有权访问编辑器)。我希望我的所有标签都位于名为tags的方法/属性中。这使它更易于使用。正常的MyEditorClass也包含保存,打开,新建等元素。所以如果有更好的方法来构建它,请告诉我=) – Patrick 2010-11-30 09:53:09

+0

好吧,现在我明白你需要什么了。答案已更新。 – NOtherDev 2010-11-30 10:02:41

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