C# الطبقات التعشيش والرؤية؟
-
29-09-2019 - |
سؤال
أحاول الحصول على نفس الوظيفة التي يتمتع بها combobox ، مثل 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 تستدعي مربع Editorbox تم نقلها إلى MyEditorClass وإذا قمت بإنشاء فئة 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؟ نظرًا لأنك لا تستطيع استخدام combobox.items ، ولكن إذا أعلنت واحدة ، فيمكنك استخدام combobox.items على تلك التي أعلنتها.
المحلول
اصنع لك Tags
منشأه readonly
, ، ثم يمكن تهيئتها في المُنشئ فقط:
public readonly TagClass Tags;
مرجع الكائن المخزن في Tags
لا يمكن تغييره لاحقًا ثم هذا الرمز:
MyEditorClass editor = new MyEditorClass(editorBox);
editor.Tags = new MyEditorClass.TagClass();
لن يجمع.
أو ، الاحتمال الثاني ، حتى أفضل - كشف الجمهور فقط لك 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 ، أضف عضوًا في Type 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);