az előző gyakorlatban megoldott feladatok OOP VB.Net lessons 12-13, már gyakoroltuk tudásunk a korábbi leckéket.
az előző leckében, megoldott feladatok OOP VB .Net órák 12-13, gyakoroltuk dolgozó Listcollections és létrehozott egy elektronikus naplót Visual Basic. NET.a today ‘ stutorial, akkor kapok vissza néhány elméleti kérdésekben. Bemutatjuk az objektum-orientált programozási világ újabb hasznosságát!
interfész
amikor egy objektum interfészére utalunk, akkor arra utalnak, hogy egy objektum kívülről látható. Már tudjuk, hogy egy objektum metódusokat tartalmazamelyek magán-vagy nyilvánosként állíthatók be. Az objektum interfésze a következőkből áll: nyilvános módszerek, így kommunikálunk bizonyos típusú objektumokkal.A korábbi leckékben már foglalkoztunk nyilvános módszerekkel, például azokkal, amelyeket az aréna harcosunknak állítottunk be. Az általunk készített harcos osztálynak a következő nyilvános voltmódszerek:
- Sub Attack(ellenség mint harcos)
- Sub Defend(hit egész számként)
- Function Alive() mint logikai
- Sub SetMessage(üzenet karakterláncként)
- Function GetLastMessage() karakterláncként
- Function HealthBar() karakterláncként
ha Warrior osztálypéldányt tárolunk egy változóban, akkor meg tudjuk hívni a Thattack() vagy Defend() metódusokat. Semmi új, igaz?
ami azt illeti, képesek vagyunk egy interfészt külön deklarálni, hasonlóan az osztályokhoz, és ezt követően adattípusként tudjuk használni.
megpróbáljuk, de egy egyszerűbb osztályon, mint a harcos osztály, amelyet készítettünk.Kezdjük egy új projekt, egy konzol alkalmazás létrehozásával, az itInterfaceSample elnevezéssel és egy egyszerű osztály hozzáadásával. Véleményem szerint elméletia fogalmakat könnyű példákkal kell magyarázni, ami azt jelenti, hogy nem olyan komoly. Ezzel minden azt mondta, csináljunk egy madár osztály! A madár képes lesz csiripelni, lélegezni és csipogni. A madár osztály fog kinézni valamitez:
Public Class Bird Public Sub Chirp() Console.WriteLine("♫ ♫ ♫") End Sub Public Sub Breathe() Console.WriteLine("Breathing...") End Sub Public Sub Peck() Console.WriteLine("Peck, peck!") End SubEnd Class
Kész! Most térjünk át a Module1-re.vb és hozzon létre egy madár példány:
Dim bird As Bird = New Bird()
miután létrehoztál egy példányt a bird osztályból, írd le, amit a példánynak hívtál, az én esetemben “bird”, és adj hozzá egy pontot közvetlenül utána. A VisualStudio ezután megjeleníti az összes osztálymódszerét (a Ctrl + Szóköz megnyomásával is meghívhatjaintellisense):
most mindent látunk, amit a madárpéldányra hívhatunk. Az általunk most megvalósított 3 módszer ott van, valamint néhány más, amely minden objektumnak megvan a bázisa.
most hozzunk létre egy felületet a madár. Fogjuk használni ainterface kulcsszó, hogy nem csak ezt. A VB-n.NET, ez egy goodpractice előtag A felület “I” (mint Interface). Kattintson a jobb gombbal aprojektre, majd válassza az új elem hozzáadása -> felület lehetőséget.
egy üres felület kerül hozzáadásra a projektünkhöz. Hozzáadjuk a metódusok fejléceit, amelyeket ez az interfész igényel. Maga a megvalósítás, a metódus tartalma később hozzáadódik az interfészt megvalósító osztályhoz.
adjunk hozzá metódusfejléceket az IBird felülethez, szándékosan kihagyjuk az egyiket, és csak csiripelést és légzést adunk hozzá:
Public Interface IBird Sub Chirp() Sub Breathe()End Interface
nem adjuk meg a nyilvános módosítót, mivel az interfész csak publicmethods-t tartalmaz. Másképp nem lenne értelme, mivel meghatározza, hogyan kell működniegy külső objektummal.
térjünk vissza a Module1-hez.vb és változtassa meg a vonalat a birdvariable-vel, így nem lesz hosszabb a madár típusnál, hanem a madár típusnál:
Dim bird As IBird = New Bird()
a fenti kód azt jelenti, hogy a bird változóban olyan objektumra számítunk, amely tartalmazza az IBird felületen megadott módszereket. A Visual Studioreports hibát jelez, mivel a Bird osztály még nem valósítja meg az IBird felületet.Bár rendelkezik a szükséges módszerekkel, először tájékoztatni kell arról, hogy megvalósítja ezt az interfészt. Lépjünk át a Bird osztályra, és hagyjuk, hogy megvalósítsa azibird felületet. Ugyanúgy csináljuk, mint amikor azt akarjuk, hogy egy osztály örököljön egy másiktól, ehhez csak az Implements kulcsszót használjuk:
Public Class Bird Implements IBird . . .
azt is meg kell adnunk, hogy az osztály mely metódusai melyik metódust valósítják meg az interfész(ek) ből. Ehhez az Implements kulcsszót is használjuk, ezúttal a módszerek meghatározása után. A Madárosztály most így fog kinézniez:
Public Class Bird Implements IBird Public Sub Chirp() Implements IBird.Chirp Console.WriteLine("♫ ♫ ♫") End Sub Public Sub Breathe() Implements IBird.Breathe Console.WriteLine("Breathing...") End Sub Public Sub Peck() Console.WriteLine("Peck, peck!") End SubEnd Class
amikor visszatérünk a Module1-hez.vb, az IBird típusú változóval rendelkező vonalmár nem okoz hibát. A Madárosztály helyesen hajtja végre az Ibirdetinterfész. Ez azt jelenti, hogy a madár példányok most tárolhatók változók thistype.
most csak a teljesség kedvéért nézzük meg, mi történik, ha eltávolítjuk az amethod-t az osztályból, amit az interfész megkövetel, mint például a Chirp()metódus. A Visual Studio figyelmeztet minket, hogy a megvalósítás nem teljes. Amint vizuálisan megerősíted, hogy az interfész függ az osztálytól, tedd vissza a módszert oda, ahová tartozik.
írjunk madarat egy ponttal utána. A Visual Studio ismét a következő módszereket kínálja:
láthatjuk, hogy most csak az interfész által biztosított módszereket hívhatjukpéldány. Ez azért van, mert a madár most az IBird típusú változó, nema madár típus. Ez azt jelenti, hogy nem hívhatjuk meg a Peck() metódust, mert nemadd hozzá az interfészhez.
Miért hagytuk ki először, kérdezhetik? Rengeteg lehetséges ok, az egyikkel már találkoztunk. Egy interfész használatával egyszerűsítünk egy komplex objektumot, és csak a program egy bizonyos részében szükséges részeket tárjuk fel.
azt is hozzá kell tennem, hogy az interfészek nem példányosíthatók. Más szavakkal, ez a kód nem fog működni:
' this code won't workDim bird As IBird = New IBird()
többszörös öröklés
a Visual Basic.net, mint a legtöbb programozási nyelv, Nem támogatja a multipleinheritance-t. Ez azt jelenti, hogy nem örökölhetünk egy osztályt egynél több osztálytól. Főleg azért, mert a metódus elnevezési ütközések nagyon jól előfordulhatnak, amikor az azonos nevű metódusokat tartalmazó több osztály örökli metódusaikat egy másik osztályba. A többszörös öröklést gyakran interfészek használatával dolgozzák megmert annyi interfészt valósíthatunk meg egy osztályban, amennyit csak akarunk. Aclass a fajta csak lehetővé teszi számunkra, hogy működjön együtt a példányok oly módon, hogy wantto. Nem kellene aggódnunk, hogy valójában milyen objektumtípusról van szó, vagy mit nyújt az interfészeken túl.
most adjunk hozzá egy ILizard felületet a projektünkhöz. A gyíkok képesek lesznek lélegezni és feltérképezni:
Public Interface ILizard Sub Crawl() Sub Breathe()End Interface
ezután megpróbáljuk “többszörös öröklés”, pontosabban, végre multipleinterfaces egyetlen osztály. Adjunk hozzá egy Pterodaktilt.vb osztály a project.It az IBird és az ILizard interfészek megvalósítása:
Public Class Pterodactyl Implements ILizard, IBirdEnd Class
ha az egeret az egyes interfészek fölé mozgatjuk, azaz kattintson az ILizard vagy az IBird elemre, akkor van egy “izzó” parancsikon az interfész kontextusban történő megvalósításához menu.It is megtörténhet automatikusan, ha írsz egy felület nevét, hogy végre.A Visual Studio ezután automatikusan létrehozza a szükséges osztálymódszereket.
Miután mindkét interfész megvalósult, a kód így fog kinézni.Figyeljük meg, hogy vannak 2 Breathe () módszerek, mivel a módszer szükséges mind byIBird, mind ILizard:
Public Class Pterodactyl Implements ILizard, IBird Public Sub Breathe() Implements ILizard.Breathe Throw New NotImplementedException() End Sub Public Sub Chirp() Implements IBird.Chirp Throw New NotImplementedException() End Sub Public Sub Crawl() Implements ILizard.Crawl Throw New NotImplementedException() End Sub Private Sub IBird_Breathe() Implements IBird.Breathe Throw New NotImplementedException() End SubEnd Class
mivel a légzés mindig ugyanaz lesz, távolítsuk el az IBird_Breathe()metódust, és adjuk hozzá az IBird-et.Lélegezz az első Breathe()módszer Implements kulcsszója után.
most már csak annyit kell tennünk, hogy meghatározzuk, mit akarunk az egyes módszerek:
Public Sub Breathe() Implements ILizard.Breathe, IBird.Breathe Console.WriteLine("I'm breathing...")End SubPublic Sub Crawl() Implements ILizard.Crawl Console.WriteLine("I'm crawling...")End Subpublic Sub Chirp() Implements IBird.Chirp Console.WriteLine("♫ ♫♫ ♫ ♫ ♫♫")End Sub
nagyjából ennyi! Most adjunk hozzá egy példányt a Pterodactyl osztálybólmodule1.vb:
Dim pterodactyl As Pterodactyl = New Pterodactyl()
győződjön meg róla, hogy mind a madár, mind a gyík módszerrel rendelkezik:
egy kicsit ragaszkodunk az interfészekhez, mivel sokkal több van bennükhogy még nem fedtük le. A következő leckében írja be a castingot és az objektumhierarchiát VB.NET, többet fog megtudniaz objektumorientált programozás fejlett technikái.