[ MarkoGagi @ 23.06.2010. 18:08 ] @
Pozdrav drugari,
potrebna mi je pomoc oko pravljenja klase.
Treba da napravim klasu kojoj bi se u konstruktoru prosleđivali podaci o korisniku(id, ime, prezime, mesto). Za svaku od tih vrednosti treba read only property .
Mora se implementirati interface ICloneable i IComparable i napraviti override metode ToString tako da vraća podatke korisnika razdvojene međusobno sekvencom ’ – ’

Pa mi to ne ide, ako moze neka pomoc bio bih vam zahvalan.
[ Radovan__III @ 23.06.2010. 18:46 ] @
pokazi nam dokle si dosao pa da vidimo gde je zapelo
[ MarkoGagi @ 23.06.2010. 18:57 ] @
Evo koda, pa mnogo ne razumem cemu ovaj Icomparable i iClonable, ne znam jel treba tu nesto jos ili je to to... i kako se pravi read only property.
Code:

using System;
namespace Projekat
{
    public class Korisnik:ICloneable,IComparable
    {
        public Korisnik(int id, string ime, string prezime, string mesto)
        {

        }
        public int Id
        {
            get
            {
                return Id;
            }
        }
        public string Ime
        {
            get
            {
                return Ime;
            }
        }
        public string Prezime
        {
            get
            {
                return Prezime;
            }
        }
        public string Mesto
        {
            get
            {
                return Mesto;
            }
        }
        public object Clone()
        {
            throw new NotImplementedException();
        }
        public int CompareTo(object obj)
        {
            throw new NotImplementedException();
        }
        public override string ToString()
        {
            return Id + "-" + Ime + "-" + Prezime + "-" + Mesto;
        }
    }
}
[ Radovan__III @ 23.06.2010. 20:25 ] @
Dobro je samo sto jos trebas da definises property ( promenjive ) . Postavi ih na private i samim tim sto postoji samo get oni su onda read only jer se moze podatak samo citati a ne i setovati .
Po meni trebalo bi i da unutar konstruktora postavis kod koji ce dodeliti pocetne vrednosti promenjivima ( to nije definisano u zadatku ali je ocigledno da treba )
[ MarkoGagi @ 23.06.2010. 20:46 ] @
Postavljeni su na private.
Code:

public Korisnik(int id, string ime, string prezime, string mesto)
        {
            id = this.Id;
            ime= this.Ime;
            prezime = this.:Prezime;
            mesto = this.Mesto;
        }

Da li ovako mislis?
[ mmix @ 23.06.2010. 20:55 ] @
Za IComparable mozes da iskoristis porednje ToString() vrednosti (posto vec sadrze sva polja), mozes i da uporedis sva polja ali ti je poredjenje ToString() krace u sorsu.
Za ICloneable mozes da iskoristis this.MemberwiseClone() metod jer su ti sva polja stringovi ili value-tipovi pa je shallow-copy dovoljan za kloniranje.

Takodje, u C#3 ne moras da imas skrivena polja da cuvaju vrednosti propertija, postoji mehanizam da se polje implicitno kreira, samo napravis da je get public a set private (tj da samo unutar klase mozes da ih postavis)

Code (csharp):

public int Id { get; private set; }
public string Ime { get; private set; }
public string Prezime { get; private set; }
...
 


Sto se tice konstruktora, obrnuto ide dodela, tj this.id = id; ...
[ MarkoGagi @ 23.06.2010. 21:18 ] @
Ok propertiji su reseni.
Ali mi nije jasno ovo oko IComparable i IClonable... nisam ih nikad koristio.

Da li mozda ovako:
Code:

  public object Clone()
        {
            this.MemberwiseClone();
            throw new NotImplementedException();
        }

        public int CompareTo(object obj)
        {
            CompareTo(ToString());
            throw new NotImplementedException();
        }
[ mmix @ 23.06.2010. 21:31 ] @
Clone mora da ti vrati objekat tog tipa, znaci samo return this.MemberwiseClone();
izbaci te throw NotImplemented linije, sad si ih implementirao, neces bacati te exceptione iz njih.

Za CompareTo je situacija malo drugacija, moras prvo da proveris da li je objekat ispravnog tipa, pa ako jeste iskoristis comapreTo od stringa

Code (csharp):

public object Clone()
{
    return this.MemberwiseClone();
}

public int CompareTo(object obj)
{
    Korisnik k = obj as Korisnik;
    if (k != null)
        return ToString().CompareTo(k.ToString());
    else
        throw new ArgumentException("Prosledjeni objekat nije instanca klase Korisnik");
}