FER / ZPR /  Ergonomija
Metode Delegati
Za napredne
Create Elegant Code with Anonymous Methods, Iterators, and Partial Classes - kao što ime članka kaže, pogledajte neke nove mogućnosti koje su došle sa 2.0 verzijom C# jezika.

» Pročitaj članak

Svojstva

Svojstva su članovi klase koji omogućuju fleksibilnost pri čitanju, pisanju ili izračunu privatnih polja. Svojstva se mogu koristiti kao da su podatkovni članovi, ali u stvarnosti, to su posebne metode koje se zovu pristupnici (accessors). Pristupnik za čitanje je definiran u get bloku, a pristupnik za pisanje u set bloku. To omogućuje podacima da im se može lagano pristupiti, ali uz sigurnost i fleksibilnost koju pružaju metode.

U sljedećem primjeru klasa TimePeriod pohranjuje vremenski period. Interno, klasa pohranjuje vrijeme u sekundama, ali svojstvo pod imenom Hours omogućuje klijentu (korisniku klase) da koristi vrijednost vremenskog perioda u jedinici sat. Pristupnici svojstva Hours obavljaju konverziju između sati i sekundi:
class TimePeriod
{
    private double seconds;

    public double Hours
    {
        get { return seconds / 3600; }
        set { seconds = value * 3600; }
    }
}

class Program
{
    static void Main()
    {
        TimePeriod t = new TimePeriod();

        // Assigning the Hours property causes 
        // the 'set' accessor to be called.
        t.Hours = 24;

        // Evaluating the Hours property causes 
        // the 'get' accessor to be called.
        System.Console.WriteLine("Time in hours: " + t.Hours);
    }
}

Korištenje svojstava

Svojstva kombiniraju aspekte i polja i metoda. Korisniku objekta svojstvo izgleda isto kao polje. Sintaksa im je identična. Get pristupnik se izvršava kada se svojstvo čita, a set pristupnik kad se svojstvu pridružuje nova vrijednost. Svojstvo bez set pristupnika se smatra kao read-only, a svojstvo bez get pristupnika kao write-only. Ako ima oba pristupnika onda se zove read-write svojstvo.

Svojstva nam pružaju mnoge pogodnosti: mogu validirati podatke prije nego što dopuste promjenu vrijednosti, mogu transparentno prikazati podatke u klasi iako se možda podaci dobavljaju iz nekog drugog izvora, poput baze podataka, mogu obaviti neku akciju kad se podaci promijene, poput dizanja događaja ili promijene vrijednosti nekog dodatnog polja.

Deklaracija svojstva ima prvo ima način (nivo) pristupa, zatim tip svojstva, pa ime svojstva i na kraju get i/ili set pristupnike:
public class Date
{
    private int month = 7;  //"backing store"

    public int Month
    {
        get
        {
            return month;
        }
        set
        {
            if ((value > 0) && (value < 13))
            {
                month = value;
            }
        }
    }
}

Get pristupnik

Tijelo pristupnika je slično metodi. Mora vratiti vrijednost koja je tipa kao svojstvo. Izvođenje get pristupnika je ekvivalentno čitanju vrijednosti polja. Na primjer, kad vraćamo privatnu varijablu iz get pristupnika i optimizacije su uključene, poziv get pristupniku je inlined od strane kompajlera tako su performnse bolje nego da se poziva metoda. Ako je pristupnik virtualan, kompajler to ne može napraviti jer ne zna pri kompilaciji koja će se metoda zapravo zvati.

Kad referenciramo svojstvo, osim u slučaju da mu se nešto pridružuje, get pristupnik se poziva da se pročita vrijednost svojstva. Npr:
Person p1 = new Person();
//...

System.Console.Write(p1.Name); // get accessor is invoked here
Get pristupnik mora završiti sa return ili throw naredbom.

Loš programski stil je ako mijenjamo stanje objekta kroz get pristupnik (iako je moguće), kao u sljedećem primjeru:
private int number;
public int Number
{
    get
    {
        return number++;   // Don't do this
    }
}
Get pristupnik se može koristiti da vrati već postojeću vrijednost nekog polja ili da izračuna neku novu vrijednost i vrati je:
class Employee
{
    private string name;
    public string Name
    {
        get
        {
            return name != null ? name : "NA";
        }
    }
}

Set pristupnik

Set pristupnik je sličan metodi koja ima void povratni tip. On koristi implicitni parametar zvan value, čiji je tip isti kao u svojstva:
class Person
{
    private string name;  // the name field
    public string Name    // the Name property
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
        }
    }
}
Kada pridružujemo vrijednost svojstvu, set pristupnik se poziva sa argumentom koji predstavlja novu vrijednost:
Person p1 = new Person();
p1.Name = "Joe";  // set accessor is invoked here                

System.Console.Write(p1.Name);  // get accessor is invoked here
Nije dozvoljeno deklarirati lokalnu varijablu sa imenom value unutar set pristupnika.

Asimetrična svojstva

Po defaultu pristupnici imaju istu vidljivost (nivo pristupa), i to onu koja je zadana u definiciji svojstva. Međutim, ponekad je zgodno ograničiti pristup nekom od pristupnika. Obično je to set pristupnik koji se ograničava, dok get pristupnik ostaje public:
public string Name
{
    get
    {
        return name;
    }
    protected set
    {
        name = value;
    }
}
Pri tome postoji par ograničenja koji se moraju poštivati:
  • Modifikatore pristupa se ne može koristiti pri implementaciji sučelja.
  • Oba pristupnika moraju biti definirana i modificirati pristup možemo samo za jednog od pristupnika.
  • Ako svojstvo ima override modifikator, modifikator pristupa za pristupnik mora biti isti kao u pristupniku kojeg prespajamo.
  • Novo pristupa mora biti ograničeniji od onog koji je definiran za samo svojstvo.

na vrh

Metode Delegati

 
Copyright © 2006, Mario Bošnjak