Question

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

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 editorBox passé dans la MyEditorClass et si vous créez une classe tags sans cet éditeur, il ne fonctionnera pas.

Mon apparence MyEditorClass comme 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 tente de faire de la statique TagClass mais cela ne fonctionne pas. Comment est structuré le combobox? Puisque vous ne pouvez pas utiliser Combobox.Items mais si vous déclarez que vous pouvez utiliser les Combobox.Items sur celui que vous déclarez.

Était-ce utile?

La solution

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

public readonly TagClass Tags;

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

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

ne compilerait pas.

Ou, deuxième possibilité, encore mieux -. Exposer seulement getter du public pour votre propriété Tags et garder l'instance privée à l'intérieur de votre classe MyEditorClass, comme dans l'exemple ci-dessous

Par ailleurs, il ne doit pas faire quoi que ce soit avec des classes de nidification. Il est tout à fait étrange d'avoir la classe publique dans 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 permettre à un 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();

Autres conseils

Dans l'élément d'ajout de classe TagClass de MyEditorClass de type et l'affecter lors de la création nouvelle instance de 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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top