Sunteți pe pagina 1din 18

Programare orientat-obiect (POO) n Visual Basic .

NET

POO n VB.NET

Clase & Obiecte

Clas = ablon pentru crearea (instanierea) obiectelor Obiect = instan a unei clase; toate proprietile i metodele definite la nivelul clasei sunt preluate de obiectele aferente tipului reprezentat de clas (clasa -> tip de date referin)

Exemplu Form
Name Text BackColor WindowState MaximizeBox MinimizeBox Width Height Activate () Hide () Close () Show ()

TextBox
Name Text Font ForeColor Multiline Width Height AppendText (text As String) Clear () Focus () SelectAll () Hide ()

POO n VB.NET

Clase & Obiecte - Exemple Persoan Nume Prenume DatNatere Vrst() Vrst(DatReferin) AflDat() SeteazDat(pDat)

Student Facultate DatAdmitere AflDat() SeteazDat(pDat)

Profesor

GradDidactic Disciplin DatDoctorat AflDat() SeteazDat(pDat)

POO n VB.NET

Clase & Obiecte

Definie clas: (la nivel de fiier)


[acces] [MustInherit | NotInheritable] [Partial] Class NumeClas [Inherits NumeClasBaz] [ instruciuni ] End Class acces specificatorul de acces al clasei (Public, Private, Protected, Friend, ProtectedFriend); n lips se consider a fi Public MustInherit indic o clas abstract, neinstaniabil direct -> necesit clase derivate pe baza sa (subclase) NotInheritable indic o clas nederivabil -> nu poate fi utilizat drept clas de baz ntr-un arbore de motenire Partial definiia clasei este incomplet -> mai multe fiiere surs vizeaz aceeai clas Inherits se folosete n cazul claselor derivate pentru a indica numele clasei de baz instruciuni definiii ale membrilor clasei (variabile & metode)

POO n VB.NET

Clase & Obiecte

Crearea obiectelor (instaniere): (la nivel de fiier / clas / procedur)


1) Dim numeObj = New NumeClas
2) Dim numeObj As NumeClas numeObj = New NumeClas 3) Dim numeObj As New NumeClas

fiecare obiect corespunde unui tip de date referin (obiectele sunt stocate n memoria heap, referinele la obiecte n memoria stack - stiv) valoarea iniial a unei variabile de tip referin este Nothing (nu este referit nici o adres din memoria heap)

POO n VB.NET

Persoana.vb

Clase & Obiecte Public Class Persoana - Exemple End Class Public NotInheritable Class Student Student.vb Inherits Persoana End Class Public NotInheritable Class Profesor Profesor.vb Inherits Persoana End Class

Private Sub btnTest (...) Handles btnTest.Click Dim persoana1 = New Persoana Dim persoana2 As New Persoana Dim persoana3 As Persoana persoana3 = New Persoana persoana2 = persoana3 ambele variabile refera acelasi obiect initial referit de persoana3 obiectul referit iniial de persoana2 nu este inca distrus (rezida in memoria heap) Dim student1 = New Student Dim profesor1 = New Profesor

persoana1 = profesor1 conversie implicita cu extinderea domeniului -> intotdeauna acceptata ambele variabile pointeaza la acelasi obiect (initial referit de profesor1)
student1 = persoana1 conversie implicita cu restrangerea domeniului -> doar pt. Option Strict Off ambele variabile pointeaza la acelasi obiect (initial referit de persoana1) End Sub

POO n VB.NET

Definiie clas: Variabile-membru

Declarare variabile - membru: (la nivel de clas)


[acces] [Shared] [ReadOnly] Dim mAtribut1 [, mAtribut2, mAtribut3 ] [As DataType] access specificator acces (Public, Private, Protected ); dac nu este indicat, implicit Private; dac este specificat Dim poate fi omis. Potrivit principiului ncapsulrii, atributele se declar Private i sunt accesate prin metode speciale (selectori & modificatori) Shared atributul vizeaz clasa, nu instanele ei (atribut static sau partajat) ReadOnly valoarea atributului este setat la momentul definirii sale i nu poate fi modificat DataType tipul de date al atributului, dup caz, referin / valoare; dac nu este specificat, implicit Object

Accesarea atributelor: Din interiorul clasei -> direct, folosind numele variabilelor Din exteriorul clasei, dac sunt vizibile: - numeObj.numeAtribut (atribut la nivel de instan) - numeClasa.numeAtribut (atribut partajat, la nivel de clas)

POO n VB.NET

Public Class Persoana Private mNume As String Persoana.vb Private mPrenume As String Private mDataNastere As Date Public Shared NrPersoane As Short End Class Student.vb

Clase & Obiecte - Exemple Public NotInheritable Class Student Inherits Persoana Private mFacultate As String Private mDataAdmitere As Date End Class

Private Sub btnTest (...) Handles btnTest.Click Dim persoana1 = New Persoana Persoana.NrPersoane += 1 variabila publica & partajata incrementata cu 1 persoana.mPrenume = Ana Eroare! mPrenume invizibil in afara clasei Persoana.vb Dim student1 = New Student este creat un nou student + o noua persoana Persoana.NrPersoane += 1 variabila publica & partajata incrementata cu 1 student1.mPrenume = Ana Eroare! mPrenume invizibil in afara clasei Persoana.vb MsgBox (Facultate: & student1.mFacultate) Eroare! mFacultate invizibil in afara clasei Persoana.vb End Sub

POO n VB.NET

Definiie clas: Metode

Definiie metode: (la nivel de clas)


[acces] [modificatori] [Shared] Sub | Function NumeMetod ([ listParametri ]) _ [Handles listEvenimente] [ instruciuni ] [ Exit Sub | Function] [ instruciuni ] End Sub | Function
access specificator acces (Public, Private, Protected, Friend, ProtectedFriend); dac lipsete, implicit Public modificator indic o anumit caracteristic a metodei: Overloads (implicit) > n cazul metodelor cu acelai nume, dar cu semnturi diferite (difer numrul/sau tipul parametrilor) Overridable > ntr-o clas de baz, corespunde metodelor care pot fi suprascrise ntr-o clas derivat (aceeai semntur, implementri diferite) NotOverridable (implicit) > ntr-o clas de baz, corespunde metodelor care nu pot fi suprascrise ntr-o clas derivat Overrides (implicit) > ntr-o clas derivat, corespunde metodelor care au aceeai semntur ca n clasa de baz, dar o implementare diferit MustOverride > ntr-o clas de baz, corespunde metodelor pentru care a fost indicat doar semntura, nu i implementarea care va fi furnizat de o clas derivat; o clas care are cel puin o metod cu acest modificator este clas abstract i trebuie declarat MustInherit

POO n VB.NET

Definiie clas: Metode

Definiie metode: (la nivel de clas)


[acces] [modificatori] [Shared] Sub | Function NumeMetod ([ listParametri ]) _ [Handles listEvenimente] [ instruciuni ] [ Exit Sub | Function] [ instruciuni ] End Sub | Function

Shared metoda se refer la clas, nu la instanele ei (metod partajat sau static) listaParametri argumentele necesare execuiei metodei; cele opionale trebuie precedate de cuvntul Optional

Accesarea metodelor: Din interiorul clasei -> direct, folosind numele metodelor Din exteriorul clasei, dac sunt vizibile: - numeObj.numeMetoda (metod definit la nivel de instan) - numeClasa.numeMetoda (metod partajat, la nivel de clas)

Clase & Obiecte / Exemple

Public Class Persoana Private mNume As String Protected mDataNastere As Date

inaccesibila din exteriorul clasei Persoana.vb accesibila si din eventualele clase derivate

Public Sub SeteazaNume (pNume As String) pentru editarea atributului mNume If pNume testeaza valoarea pNume: sa nu contina cifre .

mNume = pNume End Sub

doar daca pNume OK extrage valoarea atributului mNume

Public Function AflaNume () As String Return UCase(Trim(mNume)) End Function

Public Sub SeteazaDataNastere (pDataNastere As Date) modifica data nasterii mDataNastere = pDataNastere End Sub Public Function AflaDataNastere() As Date Return mDataNastere End Function returneaza data nasterii

Public Overridable Function AflaData () As Date de asemenea returneaza data nasterii Return mDataNastere End Function
Public Overloads Function Varsta () As Byte returneaza varsta Persoana.vb Return Year (Now()) Year (mDataNastere) End Function (parial) varsta la o anumita data de referinta: Public Overloads Function Varsta (pDataRef As Date) As Byte Return Year (pDataRef) Year (mDataNastere) End Function End Class

Clase & Obiecte / Exemple

Public Class Student Inherits Persoana Student = clasa derivata; Persoana = clasa de baza Private mFacultate As String inaccesibil din exteriorul clasei Student.vb Private mDataAdmitere As Date Public Sub SeteazaFacultate (pFacultate As String) pentru editarea valorii mFacultate If pFacultate testeaza valoarea pFacultate; Ex. valori acceptate: CIG, MAN Exit Sub if pFacultate nu e okse poate afisa un mesaj de eroare mFacultate = pFacultate doar daca pFacultate ok End Sub Public Function AflaFacultate () As String Return UCase(mFacultate) End Function citeste valoarea mFacultate

Public Sub SeteazaDataAdmitere (pDataAdmitere As Date) editeaza valoarea mDataAdmitere If pDataAdmitere <= mDataNastere testeaza daca pDataAdmitere valid mDataNastere e declarat Protected in clasa de baza, deci este accesibil din orice clasa derivata din Persoana If Varsta (pDataAdmitere)<=18 functia Varsta, declarata Public in clasa de baza Persoana este de asemenea accesibila din clasa derivata Student mDataAdmitere = pDataAdmitere End Sub doar daca pDataAdmitere OK returneaza data admiterii

Public Overrides Function AflaData () As Date Return mDataAdmitere End Function End Class

Clase & Obiects / Exemple

Private Sub btnTest (...) Handles btnTest.Click Dim objPersoana As New Persoana instantiere clasa Persoana objPersoana.mNume = Popescu Ana Eroare! mNume = atribut privat (inaccesibil din exteriorul clasei Persoana.vb) objPersoana.SeteazaNume (Popescu Ana) OK objPersoana.SeteazaDataNastere (#5/5/1979#) OK SeteazaNume, SeteazaDataNastere = proceduri publice (accesibile din afara clasei Persoana.vb) MsgBox (Nume: & objPersoana.mNume & / & Data nastere: & objPersoana.mDataNastere) Eroare! mNume, mDataNastere = atribute private MsgBox ( Nume: & objPersoana.AflaNume () & vbCrLf & _ Data nastere: & objPersoana.AflaDataNastere() & vbCrLf & Varsta actuala: & objPersoana.Varsta() & vbCrLf & Varsta la 1 Octombrie 2008: & objPersoana.Varsta (#10/1/2008#) ) OK: AflaNume, AflaDataNastere, Varsta = metode publice Dim objStudent = New Student membrii publici ai unei clase se aplica instantelor clasei respective (ex: Persoana) si instantelor claselor derivate (ex: Student) objStudent.SeteazaNume (Ionescu Ion) objStudent.SeteazaDataNastere (#10/3/1982#) objStudent.SeteazaFacultate (CIG) objStudent.SeteazaDataAdmitere (#10/1/2007#) MsgBox (Nume student: & objStudent.AflaNume() & Varsta: & objStudent.Varsta() ) functii definite intr-o clasa de baza si suprascrise de o clasa derivata -> consecinta: polimorfism Dim msg As String = Persoana & objPersoana.AflaNume() & Data nastere: & _ objPersoana.AflaData() msg &= vbCrLf msg &= Student & objStudent.AflaName() & Data admitere: & objStudent.AflaData() MsgBox (msg) End Sub

POO n VB.NET

Definiie clas: Constructori & Destructori

Constructori metode (numite New) utilizate la crearea obiectelor (instaniere); dac lipsesc, generate automat la compilare Destructori metode utilizate la distrugerea obiectelor (eliminarea din memorie); metoda Finalize() este automat apelat pentru obiectele ctre care nu mai exist referine valide prin componenta GarbageCollector; tergerea unei referine: numeObiect = Nothing
Private Sub btnTest (...) Handles btnTest.Click Dim objPersoana1 As New Persoana () Dim objPersoana2 As New Persoana (Ionescu Ana, #3/3/1990# ) MsgBox (Numar persoane: & Persoana.NrPersoane) 2 persoane objPersoana1 = Nothing eliminata referinta catre objPersoana1 obiectul nu e inca distrus MsgBox (Nr. persoane: & Persoana.NrPersoane) 2 persoane End Sub

Public Class Persoana Private mNume As String Protected mDataNastere As Date Public Shared NrPersoane As Short

Public Sub New () constructor supraincarcat mNume = mDataNastere = Now() NrPersoane += 1 End Sub
Public Sub New (pNume As String, pDataNastere As Date) mName = If pDataNastere testata validitatea pDataNastere mDataNastere = pDataNastere daca pDataNastere ok NrPersoane += 1 End Sub

End Class

POO n VB.NET

Definiie clas: Selectori & Modificatori

Selectori metode utilizate pentru citirea valorilor variabilelor private, din exteriorul clasei Modificatori metode utilizate pentru editarea valorilor variabilelor private, din exteriorul clasei Selectorii & modificatorii fiecrei variabile sunt definii folosind structuri PropertyEnd Property: [acces] [ReadOnly | WriteOnly] Property NumeProprietate ([ listParameri ]) _ As [tipDateReturnat] [ [acces] Get [ instruciuni ] End Get ] [ [access] Set (ByVal ValoareNou As DataType [listParamerii]) [ instruciuni ] End Set ] End Property access specificator acces (Public, Private, Protected ); dac lipsete, implicit Public ReadOnly variabila poate fi doar citit, nu i modificat -> doar componenta Get, nu i Set WriteOnly variabila poate fi doar modificat, nu i citit -> doar componenta Set, nu i Get listaParametri - Necesari n cazul operaiilor de editare ValoareNou nume generic care corespunde parametrului care furnizeaz valoarea ce va fi utilizat la modificarea variabilei privare ce urmeaz a fi modificat prin componenta Set a proprietii publice tipDateReturnat tipul de date al valorii returnate de componenta Get; n mod normal, identic cu cel al parametrului ValoareNou i cu cel al variabilei private accesat prin Get & Set

POO n VB.NET

Definiie clas: Selectori & Modificatori

Selectorii & Modificatorii permit accesul la atributele private ale obiectelor din exteriorul clasei de care acestea aparin (n mod normal inaccesibile, datorit ncapsulrii) ntr-o manier controlat i totodat simplificat -> nu funcii/proceduri standard, ci perechi proprietate-valoare numeObiect.ProprietatePublic = valoare opereaz Set -> modificarea valorii unui atribut privat oVariabila = numeObiect.ProprietatePublic opereaz Get -> citirea valorii unui atribut privat Form1.vb
Private Sub btnTest (...) _ Public Class Persoana Handles btnTest.Click Private mNume As String Dim s As String = Ionescu Ana Private mDataNastere As Date Dim d As Date = #4/6/1980# Public Sub New (pNume As String, pDataNastere As Date) Dim objPersoana = New Persoana(s,d) If testeaza validitatea pDataNastere & pNume mNume = pNume doar daca pNume ok MsgBox (objPersoana.mName) mDataNastere = pDataNastere doar daca pDataNastere ok Eroare, mNume = membru privat End Sub Public Property Nume () As String objPersoana.Nume = Popescu Ana Get opereaza Set Return mNume objPersoana.DataNastere = #1/1/1981# End Get Eroare! DataNastere nu poate fi editat Set (ByVal Value As String) If Value testeazaValue (lungime, caractere text) MsgBox (Nume: & _ mNume = Value doar daca Value ok objPersoana.Nume & _ End Set vbCrLf & _ End Property Data nastere: & _ Public ReadOnly Property DataNastere () As Date no exista Set objPersoana.DataNastere) Get opereaza Get; rezultate: Return mDataNastere Nume: Popescu Ana End Get Data nastere: 4/6/1980 End Property End Sub End Class

POO n VB.NET

Obiecte & Clase / Cuvinte rezervate

Me refer obiectul curent (al crui cod este executat); Ex: n fiierul care conine codul asociat cu un anumit formular, Me desemneaz instana activ a formularului respectiv. Proprietile i metodele instanei curente vor fi accesate astfel: Me.NumeProprietate or Me.NumeMetod ([ listaParametri ]) MyBase refer clasa de baz a obiectului curent -> valabil doar pentru instanele claselor derivate; se folosete de regul la definirea constructorului clasei derivate. Constructorii nu sunt motenii de la clasa de baz -> pentru ca la instanierea unei clase derivate s se execute codul constructorului clasei de baz, constructorul derivatei trebuie s includ instruciunea: MyBase.New ([ listParametri ]) With numeObiect End With alternativ la scrierea numelui obiectelor pentru accesarea atributelor i metodelor acestora; n interiorul structurii With End With obiectul desemnat prin numeObiect se consider a fi implicit, astfel c nu mai este nevoie de indicarea sa, iar proprietile i metodele aferente pot fi accesate doar prin tastarea caracterului . -> nu mai e nevoie s se utilizeze numele obiectului ca prefix

Public Class Persoana Private Sub btnTest (...) Handles btnTest.Click Private mNume As String Dim objStudent As Student Private mDataNastere As Date Dim sNume As String = Popa Dan Public Sub New (pNume As String, pDataNastere As Date) Dim sData As String = #10/1/2006# If valideaza pDataNastere & pNume objStudent = New Student (sNume, sData, _ mNume = pNume doar daca pNume ok CIG,1) mBirthDate = pBirthDate daca pDataNastere ok With objStudent End Sub .Nume = Ionescu Dan Eroare! read-only Public ReadOnly Property Nume As String .Facultate = FABBV transfer facultate Return mNume .AnStudiu = 2 promovare an End Property End With Public ReadOnly Property DataNastere As Date End Sub Return mDataNastere End Property Public NotInheritable Class Student End Class Inherits Persoana Private mFacultate As String Private mAnStudiu As Byte Public Sub New (pNume As String, pDataNastere As Date, _ pFacultate As String, pAnStudiu As Byte) controlul executiei e transferat in clasa de baza : MyBase.New (pNume, pDataNastere) mFacultate = pFacultate similar: Me.mFacultate = pFacultate mAnStudiu = pAnStudiu End Sub Public Property Facultate As String Get pentru citire mFacultate & Set pentru editare mFacultate End Property Public Property AnStudiu As Byte Get pentru citire mAnStudiu & Set pentru editare mAnStudiu End Property End Class

Obiecte & Clase - Exemple -