2010-11-30 39 views
0

Je suis en train d'obtenir les mêmes fonctionnalités qu'un combobox a, comme combobox1.Items.Add() // editor.Tags.Tags1()C# classes d'imbrication et visibilité?

Comme ceci:

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

La raison en est que la classe tags appelle la propriété editorBox passée dans MyEditorClass et si vous créez une classe de tags sans cet éditeur, cela ne fonctionnera pas.

Mon MyEditorClass ressemble à ceci:

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"; 
     } 
    } 
} 

Je tentais de faire la TagClass statique mais cela ne fonctionne pas. Comment est structurée la combobox? Puisque vous ne pouvez pas utiliser Combobox.Items mais si vous en déclarez un, vous pouvez utiliser le Combobox.Items sur celui que vous avez déclaré.

Répondre

1

Faites votre Tags propriété readonly, il peut être initialisé dans le constructeur uniquement:

public readonly TagClass Tags; 

La référence d'objet stocké dans Tags ne peut pas être modifié ultérieurement alors et ce code:

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

ne compilerait pas. Ou, deuxième possibilité, mieux encore - n'exposez que le getter public pour votre propriété Tags et gardez l'instance en privé dans votre classe MyEditorClass, comme dans l'exemple ci-dessous. Par ailleurs, il n'a rien à faire avec les classes d'imbrication. Il est assez étrange d'avoir des cours publics à l'intérieur d'une classe publique.


EDIT: Pour avoir une structure similaire à ComboBox de sorte que TagClass a accès à l'éditeur, vous pouvez passer l'instance de l'éditeur à TagClass constructeur interne. Le constructeur est interne pour ne pas autoriser le code externe à utiliser TagClass directement.

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"; 
    } 
} 

Et maintenant, cela fonctionnera:

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

problème est que je n'ai pas idée comment construire ma classe pour refléter une structure de liste déroulante. (Les tagsclass doivent également avoir accès à l'éditeur). Je veux que tous mes tags soient dans une méthode/propriété appelée tags. Cela le rend plus facile à utiliser. Le MyEditorClass normal contiendra aussi des éléments tels que Save, Open, new etc. Donc, s'il y a une meilleure façon de le construire, s'il vous plaît faites le moi savoir =) – Patrick

+0

OK, maintenant je vois ce dont vous avez besoin. Réponse mise à jour – NOtherDev

+0

Parfait, merci =). – Patrick

0

Dans la classe TagClass ajouter membre de type MyEditorClass et lui attribuer lors de la création nouvelle instance 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

Oups .. laissé la page ouverte trop longtemps, n'a pas vu l'édition ..: / –