I forrige øvelse, Løste oppgaver FOR OOP I VB. NET leksjoner 12-13, har vi praktisert vår kunnskap fra tidligere leksjoner.
I forrige leksjon, Løste oppgaver FOR OOP I VB .NET leksjoner 12-13, praktiserte vi å jobbe Med Listcollections og opprettet en elektronisk dagbok I Visual Basic. NET. i today ‘ stutorial, vil vi komme tilbake til noen mer teoretiske saker. Vi goingto avsløre enda en nytte av objektorientert programmering verden!
Grensesnitt
når man refererer til et objekts grensesnitt, refererer de til hvordan et objekt er synlig fra utsiden. Vi vet allerede at et objekt inneholder metodersom kan settes som privat eller offentlig. Objektets grensesnitt består av detsoffentlige metoder, som er måten vi kommuniserer med bestemte typer objekter.Vi har allerede jobbet med offentlige metoder i tidligere leksjoner, f.eks. Krigerklassen vi laget hadde følgende publicmethods:
- Sub Angrep(fiende Som Kriger)
- Sub Forsvar(hit Som Heltall)
- Funksjon Alive() Som Boolsk
- Sub SetMessage(melding Som Streng)
- Funksjon GetLastMessage() Som Streng
- Funksjon HealthBar() Som Streng
Hvis Vi Lagrer en warrior class-Forekomst I En Variabel, Kan Vi Ringe() Eller forsvare() Metoder På Den. Ikke noe nytt, ikke sant?
faktisk kan vi deklarere et grensesnitt separat, som vi gjør med klasser, og vi vil da kunne bruke det som datatype.
Vi gir det en tur, men på en enklere klasse enn Krigerklassen vi laget.Vi starter med å opprette et nytt prosjekt, et konsollprogram, navngi detinterfacesample, og legge til en enkel klasse. Etter min mening, teoretiskkonsepter bør forklares ved hjelp av lette eksempler, noe som ikke betyr så alvorlig. Withthat alt blir sagt, la oss lage en fugl klasse! Vår fugl vil kunne chirp, puste og peke. Vår Fugleklasse vil se ut somdette:
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
Ferdig! Nå, la oss flytte Til Module1.vb og opprette en fugl forekomst:
Dim bird As Bird = New Bird()
når du har opprettet en forekomst av fugleklassen, skriv hva du kalteforekomsten, i mitt tilfelle er det «fugl», og legg til en prikk rett etter den. VisualStudio vil da vise alle sine klassemetoder (du kan også invokeIntelliSense ved å trykke Ctrl + Space):
Vi ser nå alt vi kan ringe på fugleksemplet. De 3 metodene vi akkurat nå implementerte er der, så vel som noen andre som alle objekter har fra sin base.
la Oss nå lage et grensesnitt for vår fugl. Vi bruker grensesnittet søkeord for å gjøre nettopp det. På VB.NET, det er brapraksis å prefiks Grensesnittet med » jeg » (Som I Grensesnitt). Høyreklikk påprosjektet, og velg Legg til nytt element- > Grensesnitt.
et tomt grensesnitt vil bli lagt til vårt prosjekt. Vi legger theheaders av metoder som dette grensesnittet vil kreve. Theimplementation selv, metode innhold, legges senere av klassen thatimplements grensesnittet.
La oss legge til metodehoder I IBird-grensesnittet, vi vil med vilje utelate en av dem og bare legge til chirping og puste:
Public Interface IBird Sub Chirp() Sub Breathe()End Interface
Vi angir Ikke Den Offentlige modifikatoren siden et grensesnitt bare inneholder publicmethods. Det ville ikke være fornuftig ellers siden det spesifiserer hvordan man skal jobbe med et objekt fra utsiden.
La Oss gå tilbake Til Module1.vb og endre linjen med birdvariable slik at det ikke vil være lengre Av Fugl type, men av theIBird type:
Dim bird As IBird = New Bird()
hva koden ovenfor betyr er at i fuglvariabelen forventer vi et objektsom inneholder metodene som er angitt i IBird-grensesnittet. Visual Studioreports en feil siden Fugleklassen ikke implementerer IBird-grensesnittet ennå.Selv om det har de nødvendige metodene, må det først informeres om at det implementerer dette grensesnittet. La oss flytte Til Fugleklassen og la den implementere theIBird-grensesnittet. Vi gjør det på samme måte som når vi vil at en klasse skal arve fra en annen, bruker vi Bare Implementeringsordet for det:
Public Class Bird Implements IBird . . .
Vi må også spesifisere hvilke metoder fra klassen som implementerer hvilken metode fra grensesnittet(e). Vi bruker Implementerer søkeordet for det også, denne gangen etter metodedefinisjonene. Fugleklassen vil nå se utdette:
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
Når Vi går tilbake Til Module1.vb, linjen med variabelen Av IBird-typenikke lenger forårsaker en feil. Fugleklassen implementerer Ibirdgrensesnittet. Betyr At Fugl forekomster kan nå lagres i variabler av thistype.
nå bare for fullstendighetens skyld, la oss se hva som skjer når vi fjerner amethod fra klassen, som kreves av grensesnittet, som chirp () – metoden. Visual Studio vil advare oss om at implementeringen ikke er fullført. Onceyou har visuell bekreftelse på grensesnittets avhengighet av klassen, sett themethod tilbake der den tilhører.
La oss skrive fugl med en prikk etter det. Igjen Vil Visual Studio tilby følgende metoder:
Vi kan se at nå kan vi bare ringe metodene som tilbys av grensesnittet påforekomsten. Det er fordi fuglen nå er en variabel Av IBird-typen, ikkefugltypen. Det betyr at vi ikke kan ringe Peck () – metoden fordi vi ikke la den til grensesnittet.
Hvorfor la vi det ut i utgangspunktet, kan du spørre? Massevis av potensialgrunner, vi har allerede møtt en av dem. Ved å bruke et grensesnitt, viforenkle et komplekst objekt og avslør bare de delene som trengs i en bestemt del av programmet.
jeg må også legge til at grensesnitt ikke kan startes. Med andre ord, dettekode vil ikke fungere:
' this code won't workDim bird As IBird = New IBird()
Flere arv
Visual Basic. NET, som de fleste programmeringsspråk, støtter ikke multipleinheritance. Det betyr at vi ikke kan arve en klasse fra mer enn en annen klasse. Hovedsakelig fordi metodenavn kollisjoner kan meget vel oppstå nårflere klasser som inneholder metoder med samme navn arver sine metoderint i en annen klasse. Flere arv er ofte jobbet rundt ved hjelp av grensesnittfordi vi har lov til å implementere så mange grensesnitt i en klasse som vi ønsker. Aclass av den typen tillater oss bare å jobbe med sine forekomster på måter vi vil ha. Vi trenger ikke å bekymre deg for hvilken objekttype det egentlig er, eller hvadet gir utover grensesnittene.
la Oss nå legge Til Et ILizard-grensesnitt i prosjektet vårt. Øglervil kunne puste og krype:
Public Interface ILizard Sub Crawl() Sub Breathe()End Interface
Deretter prøver Vi «flere arv», mer nøyaktig, implementerer multipleinterfaces av en enkelt klasse. Vi legger Til En Pterodactyl.vb klasse til project.It vil implementere IBird og ILizard grensesnitt:
Public Class Pterodactyl Implements ILizard, IBirdEnd Class
klikk På ILizard eller IBird, det er en» lyspære » snarvei for Å Implementere Grensesnittet i konteksten menu.It kan også skje automatisk når du skriver et grensesnittnavn for å implementere.Visual Studio vil da automatisk generere de nodvendige klassemetodene.
etter at begge grensesnittene er implementert, vil koden se slik ut.Legg merke til at det er 2 Puste () metoder siden metoden kreves både byIBird og 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
siden pusten alltid vil være den samme, la oss fjerne IBird_Breathe () – metoden og legge Til IBird.Pust etter Implementerer sokeordet til den forste Puste () metoden.
nå er alt vi trenger å gjøre, angi hva vi vil at hver metode skal gjøre:
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
Det er ganske mye det! La oss nå legge til en forekomst Av pterodactyl-klassen inModule1.vb:
Dim pterodactyl As Pterodactyl = New Pterodactyl()
Sørg for at den har både fugl og øgle metoder:
Vi holder oss til grensesnitt for en liten stund siden det er mye mer til themthat vi ikke har dekket. I neste leksjon Skriver du inn avstøpning og objekthierarki i VB.NET, vil du lære meravanserte teknikker for objektorientert programmering.