loader
Foto

Osztályok a C# nyelvben (I. rész)

A sorozatunknak ebben a részében átnézzük általánosságban az osztályok alapjait egy konzolalkalmazás segítségével. A konstruktorok viszont a következő részben kerülnek bemutatásra.

Talán nyugodtan mondhatjuk, hogy az objektumorientált programozás (OOP) alapegysége az osztály, amellyel le tudjuk írni egy modellnek a tulajdonságait, viselkedését. Az osztály tehát a metódusok és az adatok (adattagok) halmaza.

Az adattagok azok a változók, amelyeket az osztályon belül deklarálunk. (Ha ennél a lépésnél a "const" szót is használjuk, akkor értéket kell adnunk az adott változónak, mert konstansként fogjuk majd használni.)

Az osztályból tudunk létrehozni objektumokat, példányokat.

Az objektumorientált programozás egyik elve az, hogy a felhasználó az adott osztály/példány adattagjai és metódusai közül annyit "lásson", amennyi a munkája során feltétlenül kell. A láthatóságot beállító szavakat az adattagok/metódusok elé kell írni, ezáltal tudjuk beállítani azt, hogy "kívülről" mi legyen látható.

A láthatóságot befolyásoló szavak :

  • public (osztályon belül és kívül látható)
  • private (csak az osztályon belül látható)
  • protected (az adott osztályon és az abból származtatott osztályon belül látható)
  • internal
  • protected internal

Ha definiálunk egy osztályt, akkor kerüljük a public-us adattagok használatát.

Készítsünk most egy projektet, a File/New/Project menüpont kiválasztása után válasszuk ki a ConsoleApplication projektet. A Program osztályban, ahol a Main metódus is található, írjunk két metódust, amelynek private a láthatósága, statikus és int típust adnak vissza (1. ábra).


1. ábra   A Program osztály metódusokkal
 

Ha ezt a projektet futtatjuk debug módban (F5), akkor kiírjuk a képernyőre 10+20 összegét, azaz a 30-at.

Vegyük ki most a két private láthatósággal ellátott metódust és tegyük be egy új osztályba, a "matek" osztályba úgy, hogy módosítsuk az Osszead metódusnak a láthatóságát public-ra (2. ábra).


2. ábra   A program.cs file-ban két osztály (Program, matek) van
 

Nem szerencsés, hogy egy file-ban több osztály is szerepel. Kerüljük későbbiekben ezt a megoldást.

A matek osztály csak két static-us metódust tartalmaz, ezért a két metódus meghívásakor ki kell írnunk az adott osztály nevét, és a tagoperátor (.) kiírása után meg tudjuk hívni az adott metódust. De melyikkel is tudjuk ezt megtenni? A 2. ábrán látható, hogy az IntelliSense csak az Osszead-ot ajánlja fel, mert ennek a láthatósága publikus.

Most töröljük ki a program.cs file-ból a matek osztályt, és adjuk meg újra úgy, hogy ez az osztály a matek.cs file-ban legyen. Ezt úgy tudjuk megtenni, hogy a Solution Explorer ablakban, a projektnévre kattintva az egér jobb gombjával az Add/New Item-re kattintva fel tudunk venni egy új osztályt. Ennek az "Item"-nek a neve legyen a "matek".


3. ábra   A matek osztály a matek.cs file-ban
 

Láthatjuk a 3. ábrán, hogy ez az osztály (amelyben két public-us metódusa van), hiába van külön file-ban, a "ConsoleOsztaly1" névtérben található. Egy névtérben/projektben több osztály is helyet kaphat. 


4. ábra   Látható a két metódus a matek osztályból


Példányosítás

A matek osztály csak static-us metódusokat tartalmaz. Ha példányosítjuk a matek osztályt (a memóriában helyet foglalunk le), akkor a static jelzővel ellátott metódusok, adattagok nem lesznek elérhetők.

Készítsünk ezért egy új osztályt (külön file-ban), a neve legyen : geometria (5. ábra). Legyen ebben az osztályban három adattag, a láthatóságuk private.
Legyen három metódus is, az "Ertekadas" segítségével tudunk értéket adni az "aOldal" és a "bOldal" változóknak (közvetlenül nem tudunk, hiszen ezeket kívülről nem látjuk), a "TeruletSzamol" segítségével tudjuk egy téglalapnak a területét kiszámolni. Végül, a "TeruletMutat" metódussal (amelyet látunk a geometria osztályon kívül) tudjuk a private láthatósággal rendelkező "terulet" adattag értékét kiolvasni.


5. ábra   A geometria osztály
 

Példányosítsuk most ezt az osztályt, foglaljunk helyet ennek a memóriában. A példányosításhoz szükségünk lesz a "new" dinamikus memóriafoglaló operátorra. A példányosításkor kiírjuk először az osztály nevét, majd azután a példánynak a nevét (6. ábra).


6. ábra   A geometria osztály példányosítása
 

Létrehoztunk a "new" segítségével egy "g1" nevű példányt. Látható, hogy a "g1" példánynak két metódusa van (ez nem teljesen igaz, de részletesebben később szólunk erről). Ez a két metódus a "geometria" osztályban publikusak, és nem rendelkeznek static módosítással.

Hozzunk létre még egy példányt, legyen ez a g2 (7. ábra).


7. ábra   A "geometria" osztály példányosításai
 

Mind a "g1"-nek, mind a "g2"-nek egymástól független adattagjai vannak, és a "geometria" osztály metódusait  is külön-külön meg tudjuk hívni.

Mi a szerepe az "Ertekadas" metódusnak? Az "Ertekadas" metódus segítégével tudunk az adott példányok adattagjainak értéket adni. Ezzel állítjuk be az "aOldal" és a "bOldal" változók értékeit, hogy tudjunk területet számolni. Ha nem adnánk értéket ezeknek az adattagoknak, akkor a "terulet" változó értéke nulla lenne.

Tehát, ha elfelejtenénk meghívni ezt a metódust, akkor hibás eredményeket írnánk ki a konzolra.

Hogyan kerülhető ki ez a hibalehetőség? Miért szerepel a példányosításnál (g1, g2) a jobb oldalon az osztálynév mellett két zárójel? Hogyan történik a példányosítás, kell-e ehhez valamilyen plusz metódus?

A konstruktorokról a következő részben olvashatunk.



Egyéb cikkek

Mappa

További cikkeink ebben a témakörben

Régebbi cikkeink

Ebben a cikkben megismerjük a C# nyelv által használt változók nagy részét. Nézünk egy példát a típuskonverzióra.. . . .

Ebben a cikkben bemutatjuk a metódusok alapjait. Nem érintjük viszont például a túlterhelést, ezt egy következő részben tekintjük át.. . . .

Ebben a cikkben nem csak a metódusok túlterhelését nézzük meg egy konkrét példa segítségével, hanem szóba kerülnek a generikusok is, szintén egy kisebb projekt keretén belül.. . . .