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