[[oktatas:programozás:basic:visual basic|< Visual Basic]] ====== Visual Basic .Net Objektum Orientáltan ====== * **Szerző:** Sallai András * Copyright (c) Sallai András, 2017 * Licenc: GNU Free Documentation License 1.3 * Web: http://szit.hu ===== Bevezetés ===== A Visual Basic .Net használható modulárisan és Objektumorientáltan egyaránt. Az alábbi leírás az Objektum Orientált használattal foglalkozik. Az objektum orientált programokban osztályokkal dolgozunk. Ha csak modulárisan programozunk, akkor is használunk meglévő osztályokat, de objektum orientált programozás esetén saját osztályokat hozunk létre és ez képezi a munkánk törzsét. ===== Helló Világ ===== Public Class Application Public Shared Sub Main() Console.WriteLine("Helló Világ") End Sub End Class Fordítás Mono keretrendszerrel: vbnc Program01.vb Fordítás .Net keretrendszerrel: vbc Program01.vb Futtatás Mono keretrendszerrel: mono Program01.exe Futtatás .Net keretrendszerrel: Program01.exe Linux rendszeren futtatás lehet így is: chmod +x Program01.exe ./hello.exe Objektum Orientált program esetén -- mint azt már fentebb írtuk --, a programjainkat osztályokba szervezzük. Ezt angolosan a class szóval írjuk le. Az osztálynak valamilyen nevet kell adni, és kötelezően publikusnak kell meghatározni: public class név A public azért szükséges, hogy a futtató keretrendszer hozzáférjen az osztályhoz. Az osztályokon belül metódusokat hozunk létre, amelyeknek szintén valamilyen nevet kell adnunk. Egy program mindig kötelezően kell tartalmazzon egy Main() metódust. A futtató keretrendszer ebből tudja, hogy ebben a metódusban megadott utasításokat kell elsőként végrehajtani. A Main() metódusnak van két kötelező előtagja, a public és a shared: Public Shared Main() A public szükséges a futtató keretrendszernek, hogy hozzáférjen a metódushoz. A shared pedig azt mondja meg, hogy példányosítás nélkül futtatható metódusról van szó. A Main() metódust mindig példányosítás nélkül futtathatóra állítjuk. ===== Osztály létrehozása ===== A példa kedvéért tároljunk dolgozókról információkat. Az egyszerűség kedvéért legyen most két eltárolandó érték, a név és az életkor. Az osztályoknak lehetnek mezői vagy tulajdonságai. A név és az életkor a Dolgozo osztály mezői. Public Class Dolgozo public nev As String public kor As Integer End Class Public Class Application Public Shared Sub Main() Dim janos As New Dolgozo() janos.nev = "Nagy János" janos.kor = 35 Console.WriteLine(janos.nev) Console.WriteLine(janos.kor) End Sub End Class Az osztály létrehozása után példányosítani kell azt. A fenti példában a példány létrehozása a következő: Dim janos As New Dolgozo() A janos, a Dolgozo osztály egy példánya. ===== Metódusok használata ===== Egy osztály mezőit az Objektum Orientált Programozást elvét figyelembe véve nem szoktunk publikusként megadni. De akkor hogyan férünk hozzá? Az egyes adatmezőkhöz metódusokkal fogunk hozzáférni, amelyeket már publikusként hozunk létre. A metódust szót, az Objektum Orientált Programozásban az eljárásokra és a függvényekre használjuk, azok helyett. A következő példában a "nev" mező számára létrehozunk egy beállító és egy lekérdező metódust: Public Class Dolgozo private nev As String private kor As Integer public Sub beallitNev(ByVal atvettNev As String) nev = atvettNev End Sub public Function lekerNev() As String Return nev End Function End Class Public Class Application Public Shared Sub Main() Dim janos As New Dolgozo() janos.beallitNev("Nagy János") Console.WriteLine(janos.lekerNev()) End Sub End Class A fentiek alapján, ugyanezt kell tennünk a kor mezővel is: Public Class Dolgozo private nev As String private kor As Integer public Sub beallitNev(ByVal atvettNev As String) nev = atvettNev End Sub public Function lekerNev() As String Return nev End Function public Sub beallitKor(ByVal atvettKor As Integer) kor = atvettKor End Sub public Function lekerKor() As Integer Return kor End Function End Class Public Class Application Public Shared Sub Main() Dim janos As New Dolgozo() janos.beallitNev("Nagy János") janos.beallitKor(35) Console.WriteLine(janos.lekerNev()) Console.WriteLine(janos.lekerKor()) End Sub End Class Az osztály mezői meghatározzák annak tulajdonságait, a metódusok meghatározzák az osztály viselkedését. Az osztállyal egy egységbe zárjuk az adatok és hozzájuk tartozó metódusokat, ezt hívjuk egységbezárásnak (encapsulation). ===== Konstruktor ===== A fenti kódunkat kiegészítjük a konstruktorral: Public Class Dolgozo private nev As String private kor As Integer public Sub New() nev = "Névtelen" kor = -1 End Sub public Sub beallitNev(ByVal atvettNev As String) nev = atvettNev End Sub public Function lekerNev() As String Return nev End Function public Sub beallitKor(ByVal atvettKor As Integer) kor = atvettKor End Sub public Function lekerKor() As Integer Return kor End Function End Class Public Class Application Public Shared Sub Main() Dim janos As New Dolgozo() 'janos.beallitNev("Nagy János") 'janos.beallitKor(35) Console.WriteLine(janos.lekerNev()) Console.WriteLine(janos.lekerKor()) End Sub End Class A konstruktor kiemelve az egész kódból: public Sub New() nev = "Névtelen" kor = -1 End Sub A konstruktort arra szokás használni, hogy előkészítsünk egy osztályt, kezdőértéket adjunk az osztály mezőinek. Mi is ezt tettük a "nev" és a "kor" mező is kapott egy-egy kezdőértéket. Így, ha elfelejtjük például a nevet beállítani, akkor a megjelenített név "Névtelen" lesz, és nem üres karaktersorozat. ===== Metódus túlterhelés ===== Mi lenne, ha a konstruktort meg tudnánk hívni úgy is, hogy paraméterként megadjuk mi legyen a dolgozó neve, de megmaradna az a lehetőség is, hogy nem adunk meg paramétert: public Sub New() nev = "Névtelen" kor = -1 End Sub public Sub New(ByVal atvettNev As String) nev = atvettNev kor = -1 End Sub A konstruktor így két módon használhatjuk. Hívhatjuk paraméter nélkül és névparaméterrel. A konstruktort túlterheltük. Nem csak a konstruktort lehet túlterhelni, bármelyik metódussal megtehető. A példa kedvéért, legyen egy beallitDolgozo() metódus, amelyik több alakkal is rendelkezik. public Sub beallitDolgozo(ByVal atvettNev As String) nev = atvettNev kor = -1 End Sub public Sub ballitDolgozo(ByVal atvettNev As String, ByVal atvettKor As Integer) nev = atvettNev kor = atvettKor End Sub A beallitDolgozo metódust túlterheltük. Meghívható egy vagy két paraméterrel is. ===== Öröklés ===== Szeretnénk egy dolgozó számára diplomájának számát is tárolni. De a Dolgozo osztályt szeretnénk meghagyni. Készítünk egy Mernok nevű osztályt. Mivel a mérnöknek is van neve és életkora, ezért felhasználjuk a már meglévő Dolgozo osztályt. A Dolgozo osztály minden tagját átörökítjük a Mernok osztály számára. Public Class Mernok Inherits Dolgozo private diploma As String public Sub beallitDiploma(ByVal atvettDiploma As String) diploma = atvettDiploma End Sub public Function lekerDiploma() As String Return diploma End Function End Class A Mernok osztályból létrehozott objektum továbbra is használhatja a nev és a kor mezőket. ===== Többalakúság ===== A következő példánkhoz kivettük az életkor "kor" mezőjét, a hozzátartozó kódokat, és felvettünk egy új mezőt, amiben a fizetéseket tároljuk. Felvettünk egy szamitFizetes() metódust is, amelyik a jutalommal növelt fizetést adja vissza. A mérnököknek, azonban szeretnénk kicsit több jutalmat adni. Ezért felülírjuk a Mernok osztályban a szamitFizetes() metódust. Vegyük észre, hogy protected elérésűre tettük a fizetés mezőt, mert a Mernok osztályban is el szeretnénk érni. Public Class Dolgozo private nev As String protected fizetes As Double public Sub New() nev = "Névtelen" fizetes = 500000 End Sub Overridable Function szamitFizetes() As Double Dim jutalom As Double = 30000 Return fizetes + jutalom End Function End Class Public Class Mernok Inherits Dolgozo Overrides Function szamitFizetes() As Double Dim jutalom As Double = 60000 Return fizetes + jutalom End Function End Class Public Class Application Public Shared Sub Main() Dim kati As New Mernok() Dim jani As New Dolgozo() Console.WriteLine(jani.szamitFizetes()) Console.WriteLine(kati.szamitFizetes()) End Sub End Class A Main() metódusban a szamitFizetes() metódus másként viselkedik jani objektum és másként kati objektum esetén. Ezt nevezzük többalakúságnak (polimorfizmus).