[[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).