C#ネストクラスと可視性?
-
29-09-2019 - |
質問
combox1.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に渡すコールを呼び出し、そのエディターなしでタグクラスを作成した場合、機能しないためです。
私の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";
}
}
}
私はタグクラスを静的にしようとしていましたが、それはうまくいきませんでした。コンボボックスはどのように構造化されていますか? combox.itemsを使用することはできませんが、宣言する場合は、combobox.itemを使用できます。
解決
あなたを作ってください Tags
財産 readonly
, 、その後、コンストラクターでのみ初期化できます。
public readonly TagClass Tags;
で保存されているオブジェクト参照 Tags
その後、後で変更することはできず、そのコード:
MyEditorClass editor = new MyEditorClass(editorBox);
editor.Tags = new MyEditorClass.TagClass();
コンパイルしません。
または、2番目の可能性、さらに良い - あなたのために公共のゲッターのみを公開する 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();
他のヒント
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);