cub71 Skrevet 17. august 2006 Skrevet 17. august 2006 (endret) Hvordan kan jeg la et program gi navn til nye objekter? public class Monitor { private string orig; public string getOrig() { return orig; } public void setOrig(string plass) { orig = plass; } } Hvordan kan programmet lage flere slike og gi dem navn? Endret 17. august 2006 av cub71
gatepoet Skrevet 18. august 2006 Skrevet 18. august 2006 Hvordan kan jeg la et program gi navn til nye objekter? public class Monitor { private string orig; public string getOrig() { return orig; } public void setOrig(string plass) { orig = plass; } } Hvordan kan programmet lage flere slike og gi dem navn? 6695101[/snapback] først og fremst må du ha en konstruktør for å oprette et objekt av klassen: public class Monitor { private string orig; //Konstruktør 1 - uten parameter public Monitor(){ } //Konstruktør 2 - med paramenter public Monitor(string orig){ setOrig(orig); } public string getOrig() { return orig; } public void setOrig(string plass) { orig = plass; } } så kan du hvor som helst i kjørbar kode lage objekter slik: //Opprette objekt uten parameter, og sette verdi Monitor monitor1 = new Monitor(); monitor1.setOrig("plassen"); //Opprette objekt med parameter Monitor monitor2 = new Monitor("plassen"); var det dette du tenkte på?
hockey500 Skrevet 18. august 2006 Skrevet 18. august 2006 først og fremst må du ha en konstruktør for å oprette et objekt av klassen: nei, man MÅ ikke ha en konstruktør, en konstruktør er bare en metode som kjøres når en klasse instansieres.
GeirGrusom Skrevet 18. august 2006 Skrevet 18. august 2006 (endret) ...men det gjør ting veldig mye enklere. Dessuten kan du bytte ut getOrig og setOrig med en property istedet public class Monitor { protected string orig; public Monitor() { orig = ""; // Stringer burde instansieres til "" for å unngå feil med BinaryWriter etc. } public Monitor(string plass) { this.orig = plass } public string Orig { get { return orig; } set { orig = value; } } } Ofte legger man til default constructoren i alle andre constructorer med : this() slik: Monitor(string plass) : this() {...} for at den alltid kaller default constructoren, for å sette evt. andre verdier også. Og med en constructor, kan man lage setninger som: System.Collection.ObjectModel.Collection<Monitor> list; list.Add(new Monitor("Ialla")); Istedet for System.Collection.ObjectModel.Collection<Monitor> list; Monitor mon = new Monitor(); mon.Orig = "Ialla"; list.Add(mon); Som dessuten er mer effektivt, på et ubetydelig plan, men likevel mer effektivt, AddRef blir kalt en gang, og RemoveRef blir ikke kalt før list forsvinner ut av scope. Endret 18. august 2006 av GeirGrusom
cub71 Skrevet 20. august 2006 Forfatter Skrevet 20. august 2006 Jeg har kanskje ikke formulert spørsmålet mitt godt nok. La meg prøve igjen. Hvis jeg skal opprette et stort antall Monitor-objekter må alle disse ha hvert sitt navn. Jeg tenkte da å gi dem navn monitor + et nummer. Men dette får jeg ikke til. Hadde tenkt meg noe slikt: string nyttNavn = ""; int antallMonitorer; nyttNavn = "Monitor" + antallMonitorer.ToString(); Monitor nyttNavn.Value = new Monitor(); Å bruke en string slik funker ikke. Noen bedre forslag?
oyvind_b Skrevet 21. august 2006 Skrevet 21. august 2006 Det er da man bruker f.eks. en array: Monitor[] monitor = new Monitor[100]; monitor[0] = new Monitor(); monitor[1] = new Monitor(); etc... Øyvind
lnostdal Skrevet 21. august 2006 Skrevet 21. august 2006 Eventuellt assoc array, map eller hash-table. (jeg har ikke oversikt over hva klassene for disse tingene heter i C# atm.)
hockey500 Skrevet 21. august 2006 Skrevet 21. august 2006 Du kan bruke List eller Dictionary: using System.Collections.Generic; // ... // ... List<Monitor> m = new List<Monitor>(); m.Add(new Monitor("a", "b")); m.Add(new Monitor("c", "d")); // eller Dictionary Dictionary<string, Monitor> d = new Dictionary<string, Monitor>(); d.Add("Skjermnavn", new Monitor("a", "b"); d.Add("Skjermnavn2", new Monitor("c", "d"); // Loope gjennom Dictionary: foreach (KeyValuePair<string, Monitor> kvp in d) { Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value); } // Loope gjennom List IEnumerator<Monitor> enumerableList = m.GetEnumerator(); while(enumerableList.GetEnumerator()) { Console.WriteLine("{0} ", enumerableList.Current); }
GeirGrusom Skrevet 21. august 2006 Skrevet 21. august 2006 (endret) public string GetUniqueName(Monitor mon, List<Monitor> lst, string name) { string out = name; int x; int index = 0; for(x = 0; x <lst.Length;x++) { m = lst[x]; if(m != mon) // Sjekk at vi ikke tester mot objektet vi skal navngi. { if(m.orig == out) // Sjekk om denne { index++; // legg til en out = name + index.ToString(); x = 0; // restart, for å sjekke at det ikke er noen tidligere med navnet. continue; // Gå tilbake, egentlig ikke nødvendig (må x bli satt til -1?) } } } return out; // Ingen flere invendinger fra for loopen, returner verdien. } Denne koden skal i teorien gå gjennom alle og sjekke først om f.eks. "monitor" allerede er brukt, hvis den er det, legg til "1" på slutten, hvis "monitor1" er brukt, prøv med "monitor2" etc. Endret 21. august 2006 av GeirGrusom
cub71 Skrevet 21. august 2006 Forfatter Skrevet 21. august 2006 Takk for alle forslag. For min del var det forslaget fra oyvind_b som funket for meg. PS Øyvind: Er det du som har skrevet odalizer.com ? Den er konge!
oyvind_b Skrevet 22. august 2006 Skrevet 22. august 2006 Hehe, beklager, det er nok ikke jeg I så fall ville det nok blitt en "Arendalizer". Øyvind
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå