bjorneoen_InnleggNO Skrevet 5. november 2013 Del Skrevet 5. november 2013 (endret) Hei! Har en oppgave som jeg har fått på skola og trenger litt hjelp med C# jeg! Har laget de forskjellige klassene utifra et UML skjema og de er som følgende: (Tjener) Menyskjema Søkekjema (Server) Kontroll klasse Abstrakt klasse Eiendom ByEiendom (som arver Eiendom) LandEiendom (som arver eiendom) Etype (enumeration) Bud klasse Har i kontrollklassen en SortedList<int, Eiendom> Eiendomsliste som skal bestå av eiendom objekter. Har fått til å lage metodene for å legge til eiendommer og fjerne eiendommer, men klarer ikke å finne noen måte å endere verdier på objekter som allerede ligger i eiendomslisten. Ifølge UML skal metoden være slik: +updateEiendom(enr: int, verditakst: int, solgt: bool): void /*andre detaljer kan ikke endres*/ Det er denne metoden jeg sliter med! Bruker enr som er ID på eiendommene (readonly) som int for å sortere sortedlist. Kan noen hjelpe meg med å endre eiendommer i sortedlist? Dette er da kontroll klassen min: Public class Kontroll { //Lager en sorted list med eiendomsobjekter Private SortedList<int,Eiendom> eiendomsliste = new SortedList<int,Eiendom>(); Public static readonly Kontroll kontroll = new Kontroll(); Private Kontroll() { } //Leggr til ByEiendom i eiendomslisten Public void addByEiendom(int enr, Etype etype, int verditakst, string adresse,bool solgt=false){ ByEiendom nyByEiendom = new ByEiendom(enr, etype, verditakst, solgt, adresse); eiendomsliste.Add(enr, nyByEiendom); } //Legger til LandEiendom i eiendomslisten Public void addLandEiendom(int enr, Etype etype, int verditakst, string matrikkelnr, bool solgt=false) { LandEiendom nyLandEiendom = new LandEiendom(enr, etype, verditakst, solgt, matrikkelnr); eiendomsliste.Add(enr, nyLandEiendom);} //Sletter eiendom i listen Public void delEiendom(int enr){ eiendomsliste.RemoveAt(enr); } //Her skal jeg kunne endre verdier på objekter i sortedlist public void updateEiendom(int enr, int verditakst, bool solgt) { ????? "Hvordan får jeg endret verdier på objekter i sortedlist?" } } Trenger all hjelp jeg kan få! Håper noen har en løsning til meg! Takk! Endret 5. november 2013 av bjorneoen_InnleggNO Lenke til kommentar
GeirGrusom Skrevet 5. november 2013 Del Skrevet 5. november 2013 var item = sortedList[enr]; item.VerdiTakst = verdiTakst; item.Solgt = solgt; Lenke til kommentar
bjorneoen_InnleggNO Skrevet 5. november 2013 Forfatter Del Skrevet 5. november 2013 var item = sortedList[enr]; item.VerdiTakst = verdiTakst; item.Solgt = solgt; Takk! Måtte endre item.verditakst og item.solgt til setmetodene men tror det funker! Etter mye klundring fant jeg en annen metode som jeg tror også kanskje funker en er ikke sikker! Løsning 1: Eiendom nyEiendom = eiendomsliste[eiendomsliste.Keys[enr]]; nyEiendom.setVerditakst(verditakst); nyEiendom.setSolgt(solgt); Løsning 2: var item = eiendomsliste[enr]; item.setVerditakst(verditakst); item.setSolgt(solgt); Begge disse vil fungere? Fordeler, ulemper med de to? Lenke til kommentar
GeirGrusom Skrevet 6. november 2013 Del Skrevet 6. november 2013 Takk! Måtte endre item.verditakst og item.solgt til setmetodene men tror det funker! Etter mye klundring fant jeg en annen metode som jeg tror også kanskje funker en er ikke sikker! Løsning 1: Eiendom nyEiendom = eiendomsliste[eiendomsliste.Keys[enr]]; nyEiendom.setVerditakst(verditakst); nyEiendom.setSolgt(solgt); Løsning 2: var item = eiendomsliste[enr]; item.setVerditakst(verditakst); item.setSolgt(solgt); Begge disse vil fungere? Fordeler, ulemper med de to? Den øverste løsningen er feil, da den slår opp SortedList sin nøkkel med SortedList sin nøkkel. Om du bruker var eller eksplisitt sier datatypen er bare en preferansesak. Som regel så bruker jeg var. C# har man egen syntaks for get/set metoder: public class Eiendom { public int VerdiTakst { get; set; } public bool Solgt { get; set; } } Dette tillater også at set er private som er temmelig vanlig: public class Eiendom { public int VerdiTakst { get; private set; } public bool Solgt { get; private set; } public Eiendom(int verdiTakst) { VerdiTakst = verdiTakst; } public Eiendom SelgEiendom() { return new Eiendom(VerdiTakst) { Solgt = true; } } } Du kan også ha et backing field: public class Eiendom { private readonly int VerdiTakst; // readonly betyr at verdien bare kan skrives til i Constructoren. // Merk at readonly sier ingenting om innholdet i objektet. private bool Solgt; // Ettersom vi skriver til denne i SelgEiendom kan den ikke være readonly. public int VerdiTakst { get { return VerdiTakst; } } public bool Solgt { get { return Solgt; } private set { Solgt = value; } } public Eiendom(int verdiTakst) { VerdiTakst = verdiTakst; } public Eiendom SelgEiendom() { return new Eiendom(VerdiTakst) { Solgt = true; } } } Grunnen til å bruke immutable objekter (altså typer som ikke kan endres etter de er opprettet) er at objektet i seg selv er threadsafe. Men man må da også være klar over at man ikke erstatter referansen, så hvis noen har en referanse til det gamle objektet vil ikke disse bli oppdatert. Lenke til kommentar
bjorneoen_InnleggNO Skrevet 7. november 2013 Forfatter Del Skrevet 7. november 2013 Okei skjønner! Da skal jeg få endra litt på syntaksen min så den blir riktig! Takk for utfyllende svar! Lenke til kommentar
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å