fel
le

Az adattagok

Az osztály két fő részből áll: mezők és metódusok. Ebben a fejezetben a mezőkre fogunk koncentrálni. A mezők az osztály információhordozó és tároló rétege. Kétfajta információ lehet:

  • olyan jellegű adat, amely példányonként más-más értéket képvisel (példány-szintű)
  • olyan adat, amely az osztály minden egyes példányára jellemző értéket képvisel (osztály-szintű)

Osztály-szintű adattagok

Az osztály-szintű mezők olyan jellegű adatokat hordoznak, amelyet elég egyetlen példányban tárolni, mivel ezen adat minden példány esetén amúgy is ugyanolyan értéket hordozna. Ez memóriatakarékos megoldás.

Az ilyen jellegű mezőket a static kulcsszóval kell megjelölni.

Egy konkrét autótípus modellezése esetén az adott típus minden egyes példányához (konkrét autók) ugyanakkora benzintank méret tartozik, ezért ezen érték közös a példányok között. Ugyanakkor az, hogy mi a rendszám, és mennyi benzin van éppen e pillanatban a tankban, az már példányonként eltérő.

class TMercedes_S500
{
  public static int tankMaximalisKapacitas;
  public int tankAktualisToltottsege;
  public string rendszam;
}
 

Az osztály-szintű mezők esetén a védelmi szintek (private, protected, public) ugyanúgy használatosak, és jelentésük, értelmezésük is megegyezik (hatáskör-módosítók).

Amennyiben az osztályon kívüli hivatkozunk valamely osztály-szintű mezőre, úgy ehhez nem szükséges példányt sem készíteni akár. A mezőt osztálynév.mezőnév szintaktikával direkt módon is megcímezhetjük:

public static void Main()
{
  TMercedes_S500.tankMaximalisKapacitas = 80;
}
 

Ennek az az oka, hogy a static jellegű mezők a memóriában példányoktól függetlenül, egyszer szerepelnek. Tehát már akkor is benn vannak a memóriában, amikor még az osztályból egyetlen példányt sem készítettünk el akár.

Megvalósítástól függően ezen static mezők a program indulásakor azonnal bekerülnek a memóriába, és a program futásának teljes ideje alatt végig ott is maradnak. Ezen élettartamot nevezzük statikusnak, és több programozási nyelvben is hasonló szerepet töltenek be.

Másik lehetséges megvalósítás, hogy az ilyen jellegű mezők csak akkor kerülnek be a memóriába, amikor az első hivatkozás rájuk megtörténik. Ez nyilvánvalóan memóriatakarékosabb megvalósítás, de a futtató rendszer így jóval bonyolultabb működésű, hiszen nyilván kell tartania, figyelnie kell mikor következik ez az esemény be a program életében. Valamelyest egyszerűsített technika, ha a futtató rendszer az adott osztály első hivatkozása esetén az osztály összes ilyen jellegű mezőjét létrehozza. Ez kevesebb adminisztrációs lépéssel jár.

Konstansok

A konstansok olyan, azonosítóval ellátott adatok, melyek értéke a program futása során nem változhat meg. Az OOP világában a konstansok nem állhatnak magukban, kötelező őket valamely osztály belsejébe elhelyezni. Ugyanakkor értelemszerűen a konstansok is elég ha egyszer szerepelnek a memóriában. Hiába készítünk több példányt is a hordozó osztályból, ez nem jelenti a konstansok többszörözését a memóriában. Ezért a konstansok viselkedése szinte minden szempontból megegyezik az osztály-szintű mezők viselkedésével.

class Math
{
  public const double Pi = 3.14159265358979;
  public const double E = 2.71828182845905;
}
 

A konstansokra is ugyanazzal a szintaktikával hivatkozhatunk, mint az osztályszintű mezőkre: osztálynév.konstansnév.

public static void Main()
{
  Console.Write("Kerem a kor sugarat:");
  double r = double.Parse( Console.ReadLine() );
  Console.WriteLine("A kor kerulete = {0}",2*r*Math.PI);
}
 

Osztályon belüli elérés

Osztály belsejében lévő kódban, osztály részét képező metódusban mind az osztályszintű mezők, mind a konstansok eléréséhez természetesen az osztály nevét nem kell kiírni:

class TMercedes_S500
{
  public static int tankMaximalisKapacitas;
  public int tankAktualisToltottsege;

  public int feltankol(int mennyiseg)
  {
    int befogadottMennyiseg = mennyiseg;
    if (tankAktualisToltottsege+mennyiseg>tankMaximalisKapacitas)
       befogadottMennyiseg = tankMaximalisKapacitas-tankAktualisToltottsege;
    tankAktualisToltottsege += befogadottMennyiseg;
    return befogadottMennyiseg;
  }
}
 

Példány szintű mezők

A példány szintű mezők legfontosabb jellemzői:

  • a mező a program induláskor még nem létezik, csak ha már példányt is készítettük belőle.
  • a mezőből annyi darab lesz a memóriában, amennyi példányt készítünk az adott osztályból.
  • ha egy példány megszűnik, akkor a hozzá tartozó példányszintű mezők is eltűnnek, törlődnek a memóriából, a helyük felszabadul.
  • egy mező egy adott példányhoz kötődik, a mezőben tárolt adat eléréséhez minden esetben azonosítani kell a szóban forgó példányt is.
  • a mező értéke minden példány esetén más-más lehet

A példány szintű mezők az alapértelmezett viselkedésű mezők, vagyis deklarálásuk során nem kell semmilyen kulcsszóval megjelölni azt. Vagyis a legfontosabb jellemzője a példány szintű mezőknek, hogy nem szerepel a deklarációjukban a static kulcsszó.

class TAuto
{
  public int tankAktualisToltottsege;
  public string rendszam;
}
 
A mezőre hivatkozás előtt az osztályból példányt kell készíteni. A mezőre hivatkozást a továbbiakban a példánynév.mezőnév formában kell elvégezni.
public static void Main()
{
  TAuto sajat = new TAuto();
  sajat.rendszam = "EWING-01";
  sajat.tankAktualisToltottsege = 45;

  TAuto szomszed = new TAuto();
  szomszed.rendszam = "BIGBOSS-001";
  szomszed.tankAktualisToltottsege = 30;
}
 
Hernyák Zoltán
2013-03-17 19:01:06