Avatar billede friiiiis Novice
04. juni 2015 - 13:44 Der er 3 kommentarer og
1 løsning

For mange Classses i en Form

Hej,

Jeg opretter en masse Class til at håndtere en masse grafer (mere end 20)

For at have fuld adgang til de Class i en WinForm bliver jeg nødt til at oprette instances af de forskellige Classer som Fields i en WinForm. Altså:

  public partial class Form1 : Form
    {

        private GrafClassA graf1 = null;
        private GrafClassB graf2 = null;
        private GrafClassB graf3 = null;       
        private GrafClassB graf4 = null;
        private GrafClassB graf5 = null;
        osv...

Ovenståend ehar jeg brug for at kunne håndtere forskellige events, ændre i opsætningen af graferne osv...

Er der ikke en måde at undgå at oprette alle de Fields i Form1 instances... Rent programmeringsmæssigt er det ikke kønt.

Jeg har lavet et andet eksempel herunder. Problemet er "i en nøddeskal" eksemplificeret i "Button1Click" - jeg har brug for at instances af de 2 klasser er defineret som Fields for at kunne lave en "Button1Click":

public partial class Form1 : Form
    {

        private TestClass cmbBoxA = null;
        private TestClass cmbBoxB = null;

        public Form1()
        {
            InitializeComponent();
            cmbBoxA = new TestClass(comboBox1);
            cmbBoxA._lbl = label1;
            cmbBoxB = new TestClass(comboBox2);
            cmbBoxB._lbl = label2;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            cmbBoxA.ShowMessage();
            cmbBoxB.ShowMessage();
        }
    }

    public class TestClass
    {
        private ComboBox _cmbBox { get; set; }
        public Label _lbl { private get; set; }

        public TestClass(ComboBox CmbBox)
        {
            CmbBox.Items.Clear();
            CmbBox.Items.Add("Test 1");
            CmbBox.Items.Add("Test 2");
            CmbBox.Items.Add("Test 3");
            CmbBox.Items.Add("Test 4");
            CmbBox.Items.Add("Test 5");
            this._cmbBox = CmbBox;
        }

        public void ShowMessage()
        {
            MessageBox.Show(this._cmbBox.Items[this._cmbBox.SelectedIndex].ToString()) ;
            _lbl.Text = this._cmbBox.Items[this._cmbBox.SelectedIndex].ToString();
        }

    }


PS:
A) jeg er godt klar over at bare kunne definere en event i Form1 Constructor - bær over med mig ;-)
B) Jeg er også godt klar over at jeg bare kunne bruge ComboBox Objekt egenskab (altså: CmbBox.Items.Add(Objeckt Item) og bruge den til at håndtere problemet
C) Man kunne måske også bruge databinding men lad os antage at der ikke er adgang til databinding

En bekendt har nævnt muligheden for "Dependency Injection Container" men synes ikke rigtigt jeg kan gennemskue hvordan det kan løse problemet...??

Nogen ideer??
Avatar billede kalp Novice
04. juni 2015 - 14:38 #1
Jeg har måske ikke forstået helt præcis hvad du ønsker at opnå, men det lyder som om du kunne være interesseret i factory pattern.

http://www.oodesign.com/factory-pattern.html
Avatar billede kalp Novice
04. juni 2015 - 14:42 #2
Hvis det blot er for at undgå:

private GrafClassA graf1 = null;
        private GrafClassB graf2 = null;
        private GrafClassB graf3 = null;       
        private GrafClassB graf4 = null;
        private GrafClassB graf5 = null;

så kunne du vel blot lave en enkelt liste hvor du indsætter dine objekter i?

altså:

List<GrafClassB> grafElements = new List<GrafClassB>();

og herefter tilføjer elementer til listen.

Er ovenstående ikke nok kan du wrappe listen i en klasse og tilføje en metode til at hente den relevante graf. Dermed kan du nemt tilføje andet hjælpe funktionalitet til klassen når behovet opstår.
Avatar billede friiiiis Novice
15. juni 2015 - 15:54 #3
Hej Kalp - Jeg tror det er factorypattern jeg er ude efter

Smid et svar ;-)
Avatar billede kalp Novice
15. juni 2015 - 16:08 #4
Super:-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester