26. december 2002 - 23:12Der er
20 kommentarer og 3 løsninger
Kun oprette en instans af objekt
Hej
Er der en der kan fortælle mig hvad det hedder, når jeg kun vil have at det er muligt at oprette en instans af et objekt?? jeg skal bruge det i en MDI applikation, hvor der kun kan oprettes et child window af de typer der er
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Det kan man ikke, sorry... Du kan godt måske lave en ny Collection som sørger for det, men så skal du override alt muligt som ikke er smart at override i Form/MDIForm-klasserne.
Det smarteste ville nok være at gennemsøge samlingen af child-windows når der laves et nyt, som så ikke bliver lavet hvis der findes en instans i forvejen.
Den varibel deles på tvær af alle objekter, som instansieres af klassen. Du kan så i constructoren tjekke på om variblen er er sat til true, hvis ikke sættes den til true og klassen oprettes. Hvis den er den er true i forvejen kaldes klassesn destructor i stedet og der meldes tilbage at klassen ikke kan instansieres.
Jeg er ikke helt sikker på hvad præcis du skal bruge, men muligvis er en singleton løsningen.
En singleton indeholder en static reference til sig selv så at sige, istedet for at kalde den normale konstruktør oprettes objektet istedet ved at kalde en statisk metode på klassen.
Et eksempel i noget så ældgammelt som c++, jeg har ikke lige en C# udgave ed hånden :-) :
jeg skal bare have at jeg kun kan have en mdi child form af dem der nu er, altså hvis form1 er aktiv skal der ikke kunne laves en mere af den and so on
alle child forms bliver vel samet i et array eller ligende nåde de oprettes til deres Parent, så hvis jeg kunne lave noget ligende Parent.Children.COntains[Form1]????
I din mainform: public bool ChildWindowCreated = false;
I din funktion som laver et childwindow: if (!ChildWindowCreated) { // Lav et vindue ChildWindowCreated = true; } else { // Lad være med at lave et vindue (lav f.eks. en fejlmeddelelse) }
I en funktion som kaldes når childwindow'et lukkes (lav f.eks. en event): ChildWindowCreated = false;
nax-> en MDIParent-Form har en metode der returnerer et array af MDI-Children: public Form[] MdiChildren {get;}
I det kan du lede efter din form.. Men jeg mener ikke du kan bruge contains, da du i så fald skal lave en instans af den form du vil tjekke efter (og det vil du vel ikke) så du bliver vist nødt til at løbe dine parents igennem og lave en getType() og tjekke på den...
jeg tror lige jeg prøver mig med MDIChildren metoden, den var jeg også selv ved at komme frem til. Problemet med at have en static variable i klassen f.eks. en bool og så kalde desctructoren hvis denne var true, altså der var et objekt, er at der også bliver kaldt en show() på objektet bagefter
at gennemløbe MdiChildren er ok, men hvis jeg skal sammenligne på gettype, skla jeg jo alligevel oprette et objekt for at have noget at sammenligne med
I må lige deles. jeg tror desværre ikke jeg kommer uden om at oprette et eller andet. Jeg har det således at det er muligt at oprette 3 forskellige mdichild forms fra en menu, men kun en af hver. Så hvis nu jeg lavede en metode til at gennemløbe mine MDIChildren, skal jeg jo overføre noget der indiker hvilken mdichildform det er jeg vil undersøge om er oprettet.
okay jeg vil implementer det som en singleton hvor der i single(mdi) klassen er en static bool variable som skal indiker om der eksister et objekt. Men lige nu har jeg en metode i constructoren, der undersøger om denne er true( der er et obj) hvis ikke oprettes og returneres et sådan. Men problemet er dette som er koden i parent formen der kalder: MBNodeInfoWin nodeInfoWin = new MBNodeInfoWin(); nodeInfoWin.MdiParent = this; nodeInfoWin.Show();
og så går det jo galt, hvis jeg ikke returnerer et objekt nogle nye og gode forslag som de forgående??
Det er en opfølgning på de forslag der er kommet. Altså grundet at jeg kun ønsker at kunne instantier et objekt af hver klasse, vil jeg lave klasserne som Singleton klasser. Altså de klasser der udgør mine MDI child forms. Lige nu har jeg en public metode på disse klasser som opretter et objekt og returner dette.
Nå nu er det vist også løst sådan her: //privat data i mdichild klassen private static MBNodeInfoWin classInstance = null;
en private constructor, så indtantiseringen foregår korrekt //metode til at oprette objekter.Hvis objektet er oprettet er det blot dette //der returneres igen public MBNodeInfoWin createInstance() { if( classInstance == null ) { classInstance = new MBNodeInfoWin(); } return classInstance; }
i dispose sættes classInstance så til null igen.
Når singleton klassen så skal bruge en child sker det således:
MBNodeInfoWin nodeInfoWin = new MBNodeInfoWin().createInstance();
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.