Sunteți pe pagina 1din 18

C7 Clarificri privind atributele, proprietile i umbrirea n VB NET

Considerm urmtoarea ierarhie de clase n VB.NET

Unde: -clasa Document este clas abstract iar clasa Cec este o clas concret. Clasa Cec este clasa secundar/derivat/copil avnd clasa Document clas de baz/superclasa/printe -cu m_ am definit atributele (sau cmpurile) privale ale claselor, care nu sunt vizibile din exterior. Pentru atributele (cmpurile) private vor fi definite proprietile (Property) claselor cu ajutorul selectorilor (Get) i modificatorilor (Set). Proprietile vor avea aceeai denumire cu atributele pe care le definesc (le reprezint) n afar dar fr m_ i vor ncepe cu liter mic 1) Ce sunt cmpurile (atributele) claselor n VB.NET? -sunt declaraii de variabile la nivelul clasei

Limitndu-ne doar la atributul m_FelDoc vom avea n VB.NET: - definirea clasei Document de tip abstract cu un singur atribut m_FelDoc
Public MustInherit Class Document Private m_FelDoc As String End Class

-definirea clasei concrete Cec fr membrii avnd clasa printe Document


Public Class Cec Inherits Document End Class

-definirea la nivelul clasei Form1 unei instane a clasei Cec, Cecul1 i afiarea proprietilor i metodelor obiectului Cecul1 ne relev

doar metodele implicite ale clasei Object (explicabil deoarece atributul m_FelDoc este Private i nu poate fi vzut din exterior nu poate fi accessat din afara structurii n care a fost definit). -dac am declara atributul m_FelDoc ca fiind Public: Public m_FelDoc As String atunci acesta apare n lista IntelliSense fiind precedat de simbolul cmpurilor publice (accesibil de oriunde din proiect, chiar i din alt proiect al soluiei), adic:

-dac am declara atributul m_FelDoc ca fiind Protected: Protected m_FelDoc As String atunci acesta NU apare n lista IntelliSense, deoarece este vizibil doar n clasa n care a fost definit), adic:

-dac am declara atributul m_FelDoc ca fiind Friend: Friend m_FelDoc As String atunci acesta apare n lista IntelliSense fiind precedat de simbolul cmpurilor prietene (vizibil doar n proiectul n care a fost definit), adic:

-dac am declara atributul m_FelDoc ca fiind Protected Friend: Protected Friend m_FelDoc As String atunci acesta apare n lista IntelliSense fiind precedat de simbolul cmpurilor prietene protejate, adic:

2) Ce sunt (ce reprezint) selectorii i modificatorii n VB.NET? - metodele unei clase destinate citirii (redrii) sau actualizrii (modificrii) valorilor deinute de atributele (cmpurile) inaccesibile din exterior 3) Cum pot fi implementai selectorii i modificatorii n VB.NET? -fie utiliznd metode clasice (funcii sau proceduri) care s permit citirea sau scrierea atributelor declarate private -fie utiliznd structura proprietate (property) cu dou seciuni: Get (pentru citire/redare) i Set (pentru modificare/scriere) 4) Ce presupune utilizarea metodelor clasice? -de exemplu pentru atributul m_FelDoc vom defini metoda CitesteFelDoc (o funcie care ntoace/returnez valoarea coninut n cmpul m_FelDoc) i metoda ModificaFelDoc (o procedur care pe baza valorii parametrului nouaValoareFelDoc permite nscrierea acesteia n atributul m_FelDoc).

Astfel:
Public MustInherit Class Document 'Definirea atributelor Protected m_FelDoc As String 'Definirea selectorilor si modificatorilor - prin utilizarea metodelor obisnuite Public Function CitescFelDoc() As String CitescFelDoc = m_FelDoc 'sau 'Return m_FelDoc End Function Public Sub ModificaFelDoc(ByVal nouaValoareFelDoc As String) m_FelDoc = nouaValoareFelDoc End Sub End Class

-definirea n acest caz la nivelul clasei Form1 a unei instane a clasei Cec, Cecul1 afiarea proprietilor i metodelor obiectului Cecul1 ne relev:

unde constatm c n lista IntelliSense ne apar metodele publice CitescFelDoc i ModificaFelDoc (care dup cum tim au rol de modificatori) 5) Ce presupune utilizarea structurii proprietate (property) n VB.NET? De exemplu: - pentru atributul m_FelDoc (privat) definim proprietatea felDoc (public) a crei valoare:

a) o putem citi cu ajutorul selectorului Get (care 1 Citete din m_FelDoc (privat) i 2 Transmite (returneaz) valoarea citit proprietii felDoc (o funcie cu aceast denumire)) i b) o putem modifica cu ajutorul modificatorului Set (o procedur care 3 Primete n parametrul valoare noua valoare pe care dorim s o atribuim atributului m_FelDoc pe care o 4 Modific)

Limitndu-ne doar la atributul m_FelDoc i proprietatea felDoc clasa Document conine:


Public MustInherit Class Document 'Definirea atributelor Protected m_FelDoc As String 'Definirea selectorilor si modificatorilor - prin utilizarea metodelor obisnuite Public Function CitescFelDoc() As String CitescFelDoc = m_FelDoc 'sau 'Return m_FelDoc End Function Public Sub ModificaFelDoc(ByVal nouaValoareFelDoc As String) m_FelDoc = nouaValoareFelDoc End Sub

'Definirea selectorilor si modificatorilor - prin utilizarea structurii Property Public Property felDoc() As String Get Return m_FelDoc End Get Set(ByVal value As String) m_FelDoc = value End Set End Property End Class

-definirea n acest caz la nivelul clasei Form1 a unei instane a clasei Cec, Cecul1 afiarea proprietilor i metodelor obiectului Cecul1 ne relev:

unde constatm c n lista IntelliSense ne apar alturi metodele publice CitescFelDoc i ModificaFelDoc definite anterior, ne apare i proprietatea felDoc 6) Practic ce reprezint o proprietate? -un element de interfa (deci vizibil din exterior) prin care putem s citim sau s modificm un atribut declarat privat -practic cnd proprietatea apare ntr-o expresie de atribuire n partea stng a semnului egal se va realiza modificarea, iar cnd apare n partea dreapt a semnului egal sau ntr-o expresie se va realiza citirea. Astfel:
Public Class Form1

Dim Cecul1 As New Cec Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Cecul1.felDoc = "Cec plata" 'Modificare/scriere MsgBox("Fel document contine: " & Cecul1.felDoc) 'Citire End Sub End Class

7) Ce concluzii practice se desprind din nuanrile prezentate anterior? C o clas va fi descris n mod diferit: - pentru programare (pentru programator) unde vor fi descrise toate cmpurile i metodele care urmeaz s fie definite, cu toate indicaiile i restriciile necesare implementrii lor; -pentru utilizator unde vor fi prezentate elementele de interfa accesibile acestuia, de regul proprietile i metodele accesibile unde vor fi precizate regulile de utilizare (ce pot face i cum pot fi utilizate) 8) Ce sunt restriciile de integritate sau regulile de validare ale atributelor i unde sunt utilizate? -sunt mecanismele prin care se verific dac atributele iau valori corecte -dac atributele declarate private vor fi modificate doar prin intermediul interfeei, atunci regulilile de validare vor fi introduse n modificatorul fiecrui atribut i doar atunci se accept modificarea dac valorile sunt corecte -aceeai regul trebuie s se respecte i la crearea obiectului (instanierea obiectului va rmne doar dac toate atributele vor fi corecte n caz contrar obiectul va fi invalidat) Exemplu: S presupunem c pentru clasa Cec, atributul m_TipOperatie poate lua doar valorile: P pentru cecul de plat; I pentru cecul de ncasare i S pentru cecul depus spre scontare. Atunci procedura de validare ar presupune:

Public Class Cec Inherits Document Private m_TipOperatie As Char Public Property tipOperatie() As String Get Return m_TipOperatie End Get Set(ByVal value As String) If (value = "I" Or value = "P" Or value = "S") Then m_TipOperatie = value Else MsgBox("Tip opretie este diferit de I, P sau S") m_TipOperatie = "" End If End Set End Property End Class

-iar la crearea obiectului Cecul1 vom verifica dac Cecul1.tipOperatie vom distruge obiectul considerat incorect prin Cecul1 = Nothing:
Public Class Form1 Dim Cecul1 As New Cec

= ""

Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Cecul1.felDoc = InputBox("Tastati fel document") Cecul1.tipOperatie = ("Tastati tip operatie (I/P/S):") If Cecul1.tipOperatie = "" Then Cecul1 = Nothing MsgBox("Fel document: " & Cecul1.felDoc & " Tip operatie: " & Cecul1.tipOperatie) Else MsgBox("Fel document: " & Cecul1.felDoc & " Tip operatie: " & Cecul1.tipOperatie) End If End Sub End Class

9) Ce este fenomenul de umbrire (shadowing) i de cte tipuri este? -este fenomenul care apare de regul cnd folosim acelai nume de variabil la nivele diferite de vizibilitate -umbrirea n VB.NET este de dou feluri: umbrirea de la nivelul aceluiai modul sau clas i umbrirea prin motenire 10) Ce este umbrirea de la nivelul clasei i ce presupune?

-este umbrirea care apare atunci cnd o variabil are acelai nume la nivelul unui modul/clas i la nivelul unei proceduri/funcii/metod. Fenomenul de umbrire se manifest prin aceea c variabila local este mai puternic (are ntietate) pe plan local. De exemplu fie clasa Oras cu urmtoarea structur:
Public Class Oras Private m_Primar As String = Public Sub PrimarSector() Dim m_Primar As String = MsgBox("Primar la sector End Sub Public Sub AfiseazaPrimar() MsgBox("Primarul este: " End Sub End Class "Oprescu" "Chirita" este" & m_Primar) & m_Primar)

Atunci: la apelarea metodei PrimarSector se va afia Chirita ( deoarece variabila local Dim m_Primar As String = "Chirita" este mai puternic local, n cadrul procedurii Sub PrimarSector()) iar la apelarea metodei AfiseazaPrimar se va afia Oprescu ( deoarece variabila Private m_Primar As String = "Oprescu" este singura vizibil n cadrul procedurii Sub
AfiseazaPrimar() Public Class Form1 Dim orasulBucuresti As New Oras Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click Call orasulBucuresti.AfiseazaPrimar()'Afiseaza Oprescu Call orasulBucuresti.PrimarSector()'Afiseaza Chirita End Sub End Class

- pentru a avea acces n cadrul metodei PrimarSector la coninutul variabilei de la nivelul clasei (variabila respectiv trebuie calificat (precedat) de numele modulului sau MyClass.
Public Class Oras Private m_Primar As String = "Oprescu" Public Sub PrimarSector() Dim m_Primar As String = "Chirita" MsgBox("Primar la sector este" & m_Primar)

' Calificarea atributului de la nivelul clasei MsgBox("Primarul capitalei este " & MyClass.m_Primar & " Primarul sectorului este " & m_Primar) End Sub Public Sub AfiseazaPrimar() MsgBox("Primarul este: " & m_Primar) End Sub End Class

11) Ce este umbrirea de motenire i ce presupune? -umbrirea de motenire este fenomenul care apare atunci cnd un membru (atribut, proprietate sau metod) au aceeai denumire att la nivelul clasei printe (de baz) ct i la nivelul clasei copil (derivat). n acest caz membrul disponibil este cel de la nivelul clasei copil (care obligatoriu trebuie declarat Overloads). Pentru a avea acces la atributul sau proprietatea clasei printe, numele atributului sau proprietii trebuie s fie calificat (precedat) de MyBase. De exemplu, fie ierarhia de clase:

Public MustInherit Class Tara Private m_Sefu As String = "Traian" Public Property sefu() As String Get Return m_Sefu End Get Set(ByVal value As String) m_Sefu = value End Set End Property End Class Public Class Capitala Inherits Tara Private m_Sefu As String = "Oprescu" Public Overloads Property sefu() As String Get Return m_Sefu End Get Set(ByVal value As String) m_Sefu = value End Set End Property End Class

-instana obiectului OrasulBucuresti va face disponibil n mod obinuit proprietatea de la nivelul clasei copil adic Oprescu
Public Class Form1 Dim capitalaBucuresti As New Capitala Private Sub Button3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button3.Click MsgBox(capitalaBucuresti.sefu) 'Afiseaza Oprescu End Sub End Class

-pentru a afia valoarea proprietii sefu de la nivelul clasei Tara n cadrul clasei Capitala aceasta trebuie s fie calificat de MyBase:
Public Class Capitala Inherits Tara Private m_Sefu As String = "Oprescu" Public Overrides Property sefu() As String Get Return m_Sefu End Get Set(ByVal value As String) m_Sefu = value End Set End Property Public Sub AfiseazaSefulTarii() 'Calific proprietatea sefu la nivelul clasei Tara MsgBox("Seful tarii= " & MyBase.sefu) End Sub End Class

i la apel vom avea:


Public Class Form1 Dim capitalaBucuresti As New Capitala Private Sub Button3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button3.Click Call capitalaBucuresti.AfiseazaSefulTarii() ' Afiseaza Traian End Sub End Class

12) Cum se creaz obiectele n VB.NET? -obiectele sunt create prin instanierea claselor: a) definire

[acces] numeObiect As numeClasa i b) iniializare numeObiect = New numeClasa sau c) definire cu iniializare [acces] numeObiect As New numeClasa -efectul este c n stiv se va aloca o zon de memorie de 4 octei care are denumirea numeObiect i n aceast zon de memorie se va nregistra (memora) adresa (referina) din zona de memorie heap (gramad) de unde ncepe memoria alocat pentru obiect (spaiul alocat memomorrii membrilor obiectului). La utilizarea doar a instruciunii: [acces] numeObiect As numeClasa n zona de referin va fi memorat Nothing. Adresa efectiv va fi memorat doar la utilizarea constructorului New care aloc spaiul necesar n heap 13) Care este durata de via a obiectelor? -obiectele vor exista ct timp variabila referin din stiv este vizibil (utilizabil) sau pn cnd obiectul va fi distrus Pentru a nelege durata de via a obiectelor vom proceda astfel: considerm clasa DoarPrenume cu urmtoarea structur
Public Class DoarPrenume Public prenume As String 'Constructor supraincarcat Public Sub New(ByVal noulPrenume As String) prenume = noulPrenume MsgBox("Am initializat obiectul: " & noulPrenume) End Sub End Class

-la evenimentul click pe Button4:


Private Sub Button4_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button4.Click

'pasul a 'definire obiecte Dim Prenume1 As DoarPrenume Dim Prenume2 As DoarPrenume 'initializare obiecte Prenume1 = New DoarPrenume("Veronica") Prenume2 = New DoarPrenume("Cristina") 'pasul b 'afisarea continutului obiectelor MsgBox("Obiectul1 contine: " & Prenume1.prenume) MsgBox("Obiectul2 contine: " & Prenume2.prenume) 'pasul c Prenume2 = Prenume1 'afisarea continutului obiectelor 'pasul d MsgBox("Obiectul1 contine: " & Prenume1.prenume) MsgBox("Obiectul2 contine: " & Prenume2.prenume) End Sub

-pasul a): vom crea obiectele: Prenume1 pentru Veronica i Prenume2 pentru Cristina -pasul b): vom lista coninutul obiectelor (ne convingem c ele exist) -pasul c): vom atribui lui Prenume2 adresa memorat n Prenume1
Prenume2 = Prenume1

-pasul d): reafiarea coninutului obiectelor. Vom constata c att obiectul Prenume1 ct i obiectul Prenume2 vor afia aceelai prenume Veronica (practic obiectul Prenume2 nu mai poate fi referit (accesat))

Obiectul Prenume2 nu mai exist logic (nu mai poate fi accesat). El fizic un timp poate s mai existe (mai ocup un spaiu n memorie pn cnd: garbage collector-ul l terge din memorie)

14) Ce se ntmpl dac tergem invalidm referina de la adresa obiectului Prenume1? -dac invalidm referina de la adresa obiectului Prenume1 cu:
Prenume1 = Nothing

Evident c prin referina Prenume1 nu mai avem acces la obiectul nostru (nu mai avem adresa de acces la membrii acestuia) i vom primi un mesaj de eroare:

15) Ce se ntmpl cu obiectul Prenume1 n acest caz, mai exist sau nu mai exist? -surprinztor acesta mai exist, deoarece mai exist o referin vizibil ctre acesta i anume referina Prenume2. Pentru a ne convinge n sursa anterioar vom transforma n comentariu instruciunea care a generat eroarea i vom avea:
Prenume1 = Nothing 'MsgBox("Obiectul1 contine: " & Prenume1.prenume) MsgBox("Obiectul2 contine: " & Prenume2.prenume)

Se va afia:

Practic a avut loc urmtorul proces: -la crearea celor dou obecte:

Constatm c variabilele Prenume1 i Prenume2 refer (are memorat) adresa unui obiect i anume Prenume1 refer Obiectul Prenume1 iar Prenume2 refer Obiectul Prenume2 -dup operaiunea de atribuire:
Prenume2 = Prenume1

Constatm c variabilele Prenume1 i Prenume2 refer (are memorat) adresa aceluiai obiect i anume refer Obiectul Prenume1 iar Obiectul Prenume2 nu mai poate fi accesat (logic el nu mai exist) dei constatm c mai ocup nc spaiu n memoria heap.

-dup operaiunea: Prenume1

= Nothing

Constatm c variabila Prenume1 nu mai conine nimic dar variabila Prenume2 refer (are memorat) n continuare adresa (refer) Obiectul Prenume1 care mai exist i mai poate fi accesat. 16) Cine cur memoria heap de obiectele care nu mai sunt utile (nu mai au referine vizibile)? -utilitarul (obiectul) garbage collector (gc). Procesul garbage collector se declaneaz periodic n mod automat i cur memoria de obiectele nefolositoare. -procesul se declaneaz de regul cnd un obiect rmne fr referin activ sau cnd memoria heap a devenit insuficient -nainte de eliminarea unui obiect garbage collector ncearc s execute metoda Finalize() a obiectului. Acest amnunt este util deoarece practic prin metoda Finalize() care poate fi rescris pentru fiecare obiect se pot realiza anumite operaiuni (deconectarea de la un servr, nchiderea unei baze de date sau fiier, resetarea unor drepturi de acces, etc.), nainte de a terge obiectul. Practic metoda Finalize() nu poate fi apelat (invocat, activat) dect de garbage collector

-programatorul poate fora declanarea procedurii de curire prin apelarea metodei Collect, dar nu poate cunoate cnd va fi ters un obiect i care este ordinea de tergere a acestora

-programatorul poate s interzic tergerea unui obiect prin folosirea metodei Gc.SuppressFinalize(numeObiect). Deprotejarea acestuia se face prin metoda ReRegisterForFinalize.

S-ar putea să vă placă și