2010-11-30 19 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(); 
} 

tagsクラスは、MyEditorClassに渡されたeditorBoxを呼び出し、そのエディタなしでタグクラスを作成すると、動作しません。

My MyEditorClassは次のようになります。

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クラス内のインスタンスを非公開にします(下の例を参照)。

ところで、ネストクラスで何もする必要はありません。パブリッククラスの中にパブリッククラスを持たせることは非常に奇妙です。


EDIT:TagClassはエディタへのアクセスを持っている、あなたはTagClass内部コンストラクタにエディタインスタンスを渡すことができるように ComboBoxと同様の構造を持っています。外部コードで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"; 
    } 
} 

そして今、これは動作します:TagClassクラスで

MyEditorClass editor = new MyEditorClass(editorBox); 
editor.Tags.InsertTag1(); 
+0

問題は、私はありません持っているということです私のクラスをコンボボックス構造を反映するようにビルドする方法。 (tagsclassはエディタにもアクセスできる必要があります)。すべてのタグをタグというメソッド/プロパティの内側に置いて欲しい。それにより、使いやすくなります。通常のMyEditorClassには、Save、Open、newなどの要素も含まれています。それを構築するより良い方法があれば、私に教えてください=) – Patrick

+0

これで、必要なものが表示されます。回答が更新されました。 – NOtherDev

+0

パーフェクト、ありがとう=)。 – Patrick

0

型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); 
+0

残念ながら、ページをあまりに長く開いたままにしていましたが、編集が表示されませんでした:/ –