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) Clase & Obiecte Exemplu Form Name Text BackColor WindowState MaximizeBox MinimizeBox Width Height
Activate () Hide () Close () Show ()
TextBox Name Text Font ForeColor Multiline Width Height
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)
Public Class Persoana
End Class POO n VB.NET Public NotInheritable Class Student Inherits Persoana
End Class Public NotInheritable Class Profesor Inherits Persoana
End Class Clase & Obiecte - Exemple - 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 Persoana.vb Student.vb Profesor.vb
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 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) Accesarea atributelor: Public Class Persoana Private mNume As String Private mPrenume As String Private mDataNastere As Date Public Shared NrPersoane As Short
End Class POO n VB.NET Public NotInheritable Class Student Inherits Persoana Private mFacultate As String Private mDataAdmitere As Date
End Class Clase & Obiecte - Exemple - 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 Persoana.vb Student.vb
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 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 Definiie clas: Metode Accesarea metodelor: Definiie metode: (la nivel de clas) [acces] [modificatori] [Shared] Sub | Function NumeMetod ([ listParametri ]) _ [Handles listEvenimente] [ instruciuni ] [ Exit Sub | Function] [ instruciuni ] End Sub | Function 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) Public Class Persoana Private mNume As String inaccesibila din exteriorul clasei Persoana.vb Protected mDataNastere As Date 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 doar daca pNume OK End Sub
Public Function AflaNume () As String extrage valoarea atributului mNume Return UCase(Trim(mNume)) End Function
Public Sub SeteazaDataNastere (pDataNastere As Date) modifica data nasterii mDataNastere = pDataNastere End Sub
Public Function AflaDataNastere() As Date returneaza data nasterii Return mDataNastere End Function
Public Overridable Function AflaData () As Date de asemenea returneaza data nasterii Return mDataNastere End Function
Public Overloads Function Varsta () As Byte returneaza varsta Return Year (Now()) Year (mDataNastere) End Function 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 C l a s e
&
O b i e c t e
/
E x e m p l e
Persoana.vb (parial) 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 citeste valoarea mFacultate Return UCase(mFacultate) End Function
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 doar daca pDataAdmitere OK End Sub
Public Overrides Function AflaData () As Date returneaza data admiterii Return mDataAdmitere End Function
End Class C l a s e
&
O b i e c t e
/
E x e m p l e
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 C l a s e
&
O b i e c t s
/
E x e m p l e
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 POO n VB.NET 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 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 Definiie clas: Constructori & Destructori 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: POO n VB.NET [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 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 POO n VB.NET Public Class Persoana Private mNume As String Private mDataNastere As Date Public Sub New (pNume As String, pDataNastere As Date) If testeaza validitatea pDataNastere & pNume mNume = pNume doar daca pNume ok mDataNastere = pDataNastere doar daca pDataNastere ok End Sub Public Property Nume () As String Get Return mNume End Get Set (ByVal Value As String) If Value testeazaValue (lungime, caractere text) mNume = Value doar daca Value ok End Set End Property Public ReadOnly Property DataNastere () As Date no exista Set Get Return mDataNastere End Get End Property End Class
Private Sub btnTest (...) _ Handles btnTest.Click Dim s As String = Ionescu Ana Dim d As Date = #4/6/1980# Dim objPersoana = New Persoana(s,d)
MsgBox (objPersoana.mName) Eroare, mNume = membru privat
objPersoana.Nume = Popescu Ana opereaza Set
objPersoana.DataNastere = #1/1/1981# Eroare! DataNastere nu poate fi editat
MsgBox (Nume: & _ objPersoana.Nume & _ vbCrLf & _ Data nastere: & _ objPersoana.DataNastere) opereaza Get; rezultate: Nume: Popescu Ana Data nastere: 4/6/1980 End Sub Definiie clas: Selectori & Modificatori Form1.vb 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
POO n VB.NET Obiecte & Clase / Cuvinte rezervate Obiecte & Clase - Exemple - Private Sub btnTest (...) Handles btnTest.Click Dim objStudent As Student Dim sNume As String = Popa Dan Dim sData As String = #10/1/2006# objStudent = New Student (sNume, sData, _ CIG,1) With objStudent .Nume = Ionescu Dan Eroare! read-only .Facultate = FABBV transfer facultate .AnStudiu = 2 promovare an End With
End Sub Public Class Persoana Private mNume As String Private mDataNastere As Date Public Sub New (pNume As String, pDataNastere As Date) If valideaza pDataNastere & pNume mNume = pNume doar daca pNume ok mBirthDate = pBirthDate daca pDataNastere ok End Sub Public ReadOnly Property Nume As String Return mNume End Property Public ReadOnly Property DataNastere As Date Return mDataNastere End Property End Class Public NotInheritable Class Student 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