fel
le

A metódusok

Az osztály két fő részből áll: mezők és metódusok. Miután tisztáztuk, hogy az osztályban kétfajta mező szerepelhet: osztály-, és példányszintű, úgy hasonló vonásokat fedezhetünk fel a metódusok vizsgálata közben. Kétfajta metódust ismerünk:

  • osztály-szintű metódusok
  • példány-szintű metódusok

Osztály-szintű metódusok

Az osztály-szintű metódusok hasonlóan az osztály-szintű mezőkhöz static kulcsszóval vannak megjelölve. Ezen metódusok valamely védelmi szinttel vannak jellemezve.

class TFoiskola
{
  public static void FelevMegnyitasa( int tanev, int felev)
  {
    Console.WriteLine("A foiskolan a {0}. év {1}. tanévét megnyitom.",tanev,felev);
    OrarendekTorlese();
    IndexekLezarasa();
    GazdasagiEsemenyekNullazasa();
  }
}
 

A metódust meghívása az osztálynév.metódusnév formában történhet:

public static void Main()
{
 TFoiskola.FelevMegnyitasa( 2006, 2 );
}
 

Az osztályszintű metódusok akkor is meghívhatóak, ha az adott, tartalmazó osztályból egyetlen példányt sem készítettek. E miatt az osztályszintű metódus belsejében nem szabad hivatkozni semmilyen példányszintű mezőre sem, hiszen elképzelhető olyan eset is, amikor az adott mezőből még nincs is a memóriában. Másrészt ha lenne is példányunk, a metódus meghívásakor nem kell a példányra hivatkozni, így a metódus sem tudná, hogy melyik példány mezőjét kell elérni.

Az osztályszintű metódus belsejében ezért csak osztályszintű mezőkre, és konstansokra szabad hivatkozni.

A Main() függvény, a főprogram is egy ilyen osztályszintű metódus. Ennek oka, hogy a program indulásakor még semmilyen osztályból semmilyen példányunk nem létezik, ezért csakis valamilyen osztályszintű metódus indítható. A példányok gyártását a Main() már elkezdheti, és utána már működtetheti a programot a példányszintű metódusok segítségével.

Az osztályszintű metódusok belsejéből másik, saját osztálybéli static metódus meghívható. De másik, példányszintű metódus már nem! Ennek legfőbb oka, hogy a példányszintű metódus hívásához példányra is szükség lenne, amely azonban nem feltétlenül áll rendelkezésre ezen a ponton.

Osztály-szintű metódusok alkalmazása

Osztályszintű metódust készítünk, ha ...

  • az adott osztályból nem lesz példányosítás. Ennek oka lehet, hogy nincs is értelme annak, hogy több példány készüljön. Ekkor az osztályt eleve úgy tervezzük meg, hogy minden mezője és minden metódusa osztályszintű legyen. Nyilván nem is készítünk példányszintű mezőket és metódusokat. Ilyen osztály például a System.Console, vagy a System.Math.
  • ha egy metódus törzsében nem hivatkozunk sem példányszintű mezőkre, sem példányszintű metódust nem hívunk meg. Ekkor a metódust osztályszintűre alakíthatjuk, melyet példányosítás nélkül is szabad meghívni. A példányosítás mindenképpen idő-, és memóriaigényes művelet, ezért ha igazából nincs rá szükség - ne kényszerítsük rá a többi programozót.
  • az előző szituáció könnyen előadódhat, ha a metódus futtatásához szükséges adatok mindegyike a metódus paraméterezésében rendelkezésre áll. Például a Environment.GetEnvironmentVariable(string variable) függvény is ilyen, mely a paraméterében megnevezett nevű környezeti (operációs rendszer szintű) változóhoz tartozó értéket adja vissza.

Példány-szintű metódusok

A példány szintű metódus az alapértelmezett metódus-típus, tehát deklarációja során semmilyen speciális kulcsszó használatára nincs szükség.

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;
 }
}
 

A példányszintű metódusok meghívásához példányra van szükség, a metódushívás szintaktikája példánynév.metódusnév.

public static void Main()
{
   TMercedes_S500 sajat = new TMercedes_S500();
   int max = sajat.feltankol(30);
   Console.WriteLine("{0} liter benzin tankolása megtörtént",max);
}
 

Mivel egy példányszintű metódus meghívása során a hívás helyén azonosítjuk a példányt, így a metódus belsejében szabad példányszintű mezőket kezelnünk, hiszen a rendszer tudni fogja melyik példány mezőit kívánjuk kezelni. Ezen ok miatt szabad ezen metódusokból másik példányszintű metódust is meghívni. Ekkor a példány automatikusan továbbadódik a háttérben, ezért a másik példányszintű metódus is ugyanazon a példányon fog műveletet végezni.

A példányszintű metódus belsejében az osztályszintű mezők, metódusok természetesen elérhetőek, hiszen azok működtetéséhez példányra sincs szükség.

public static void Main()
{
    ArrayList nevek = new ArrayList();
    lista.Add( "Marika" );
}
 
Hernyák Zoltán
2013-03-17 18:45:43