Hozzáférés a statikus adattagokhoz
Statikus adattagok esetén ezekhez az adattagokhoz nem az objektumokon, hanem közvetlenül az osztályokon keresztül férhetünk hozzá. Pontosabban arról van szó, hogy ha be akarjuk állítani egy statikus adattag értékét, akkor nem kell belőle egy objektumot létrehozni erre a célra, hanem közvetlenül az osztály nevét felhasználva tehetjük ezt meg a megszokott szintaktikával.
Példa statikus adattagra
Tekintsük az alábbi ábrát, ahol két vonal van behúzva egy koordináta rendszerbe. Ha csak ilyen, origóból kiinduló vonalakat akarunk ábrázolni, akkor meggondolandó, hogy vonalainknak elég a végpont koordinátát megadni, vagyis a kezdő pontja lehet statikus, hiszen akkor ez minden ebből az osztályból származó objektumra érvényes lesz. Sőt, ha valamilyen okból a kezdőpontot el akarnánk tolni, egy mozdulattal megtehető, és minden objektum követni fogja.
Nézzük, hogyan kell ezt megvalósítani C# nyelven. Létrehozunk egy Pont osztályt, aminek van két, x, y nyilvános adattagja. Ezek a koordináták. Létrehozunk egy Vonal osztályt, aminek két nyilvános adattagja a kezdőpont és a végpont. Mindkettő egy-egy Pont objektum. (Ne feledjük, hogy a síkon egy pont két számból áll. pl. (1,2) ahol az x=1, y=2). A kezdőpontot azonban statikusnak deklaráltuk (11 -12. sor):
static public Pont kezdőpont= new Pont();
public Pont végpont = new Pont();
A végpont egyszerű nyilvános adattag. A programban létrehozzuk a vonal objektumokat (21,22. sor), azután megadjuk a kezdőpontot (25, 26. sor). Figyeljük meg, hogy ez esetben az osztály nevével kell hozzáférni az adattaghoz, hiszen ennek minden objektumára érvényes lesz:
Vonal.kezdőpont.x = 0;
Vonal.kezdőpont.y = 0;
A vonalak készítéséhez most már elég azok végpontját megadni, de ezeket már az objektumokon keresztül kell megtennünk. Például a Vonal1 esetén (28, 29. sor):
Vonal1.végpont.x = 3;
Vonal1.végpont.y = 4;
Forráskód:
1 // A pont osztály
2 class Pont
3 {
4 public int x;
5 public int y;
6 }
7 // A vonal osztály
8 class Vonal
9 {
10 // statikus adattag deklarálása
11 static public Pont kezdőpont= new Pont();
12 public Pont végpont = new Pont();
13 }
14 Az alkalmazás osztálya
15 class Vonalak
16 {
17 //Innen indul a program
18 public static void Main()
19 {
20 // Létrehozunk két vonal objektumot
21 Vonal Vonal1 = new Vonal();
22 Vonal Vonal2 = new Vonal();
23
24 // Beállítjuk a Vonalak kezdőpontját. Az osztály nevével hivatkozunk rá!
25 Vonal.kezdőpont.x = 0;
26 Vonal.kezdőpont.y = 0;
27 // Megadjuk a Vonal1 végpontját
28 Vonal1.végpont.x = 3;
29 Vonal1.végpont.y = 4;
30 // Megadjuk a Vonal2 végpontját
31 Vonal2.végpont.x = 7;
32 Vonal2.végpont.y = 8;
33 }
34 }
Statikus metódusok
Ahogy statikus adattagokat, úgy statikus metódusokat is létrehozhatunk az osztályainkban. Ezt az osztályban a tagfüggvény deklarációjakor kell megtennünk. Ha egy osztálynak van statikus tagfüggvénye, akkor ezt sem a belőle létrehozott objektumokon keresztül működtethetjük, hanem közvetlenül az osztály nevét kell használnunk a megszokott szintaktikával. Adott esetben ezt kényelmi okokból is megtehetjük olyankor, ahol nem különösen objektumfüggő feladataink vannak.
Példa Statikus tagfüggvényre
Egy nagyon egyszerű C# programon tanulmányozzuk a statikus tagfüggvények hívását. Ez a program egy Szamolo nevű osztályt tartalmaz, aminek egyetlen tagfüggvénye a befogo (6-9. sor), ami derékszögű háromszög befogóját képes kiszámítani. Mivel ez a függvény statikus, ezért közvetlenül az osztály nevével hivatkozhatunk rá, így számára nem kell objektumot létrehozni. Érdekesség a dologban, hogy a C#-nak van egy Math nevű zárt osztálya (belőle semmi nem örökíthető), ami rengeteg matematikai tagfüggvényt tartalmaz, többek között az általunk használt sqrt (négyzetgyök)-t is. Ebben az osztályban minden tagfüggvény statikus, így közvetlenül a Math mint osztálynév segítségével elérhetők.
A 15-17.sorban az a, b (befogók), c (átfogó) változók deklarációja, a 18.-ban pedig a statikus tagfüggvény használata található.
Forráskód
1 using System;
2 class Szamolo
3 {
4 //Statikus tagfüggvény, derékszögű háromszög átfogóját számolja ki
5
6 static public long befogo( long x, long y )
7 {
8 return (Math.Sqrt(x *x + y* y));
9 }
10 }
11 public class Matematika
12 {
13 public static void Main()
14 {
15 long a = 3;
16 long b = 4;
17 long c;
18 c=Szamolo.befogo(a,b);
19 }
20 }
Statikus konstruktor
A statikusnak deklarált konstruktorok úgy viselkednek, hogy őket a rendszer már azelőtt meghívja, mielőtt belőlük az első objektum elkészülne, és többet sohasem. Ennek gyakorlati jelentősége ott van, ha az egész alkalmazásra vagy osztályra vonatkozó alapbeállításokat akarunk kikényszeríteni.
Statikus adattagok esetén az adattagokhoz nem az objektumokon, hanem közvetlenül az osztályokon keresztül férhetünk hozzá. Pontosabban arról van szó, hogy ha be akarjuk állítani egy statikus adattag értékét, akkor nem kell belőle egy objektumot létrehozni erre a célra, hanem közvetlenül az osztály nevét felhasználva tehetjük ezt meg a megszokott szintaktikával.
Ahogy statikus adattagokat, úgy statikus metódusokat is létrehozhatunk az osztályainkban. Ezt az osztályban a tagfüggvény deklarációjakor kell megtennünk. Ha egy osztálynak van statikus tagfüggvénye, akkor ezt sem a belőle létrehozott objektumokon keresztül működtethetjük, hanem közvetlenül az osztály nevét kell használnunk a megszokott szintaktikával. Adott esetben ezt kényelmi okokból is megtehetjük olyankor, ahol nem különösen objektumfüggő feladataink vannak.
A statikusnak deklarált konstruktorok úgy viselkednek, hogy őket a rendszer már azelőtt meghívja, mielőtt belőlük az első objektum elkészülne, és többet sohasem.