Documente Academic
Documente Profesional
Documente Cultură
nelege structura acestora i relaiile dintre ele, a fost dezvoltat un limbaj special de
descriere, numit UML (Universal Modeling Language). Vom ncerca n cele ce urmaz,
s introducem i cteva noini referitoare la acest limbaj.
S presupunem de exemplu c
avem o clasa Prjitur. Reprezentarea
Prjitur
Savarina:Prjitur
UML a acestei clase poate fi vzut n
fig. 2.a. Se poate observa c numele
clasei este scris n partea de sus casetei.
n mod absolut similar, se poate
a)
b)
Figura 2
reprezenta i o instaniere a clasei, fie
aeasta Savarin (fig. 2.b). Numele
instanei este prezentat mpreun cu numele clasei, separate prin :.
1.2.1 Proprieti i cmpuri
Proprietile i cmpurile (atributele) asigur accesul la datele coninute n
interiorul unui obiect. Practic, prin aceasta se pot diferenia diferite obiecte ce reprezint
instanieri ale aceleiai clase. Aceste date vor furniza n fapt starea obiectului respectiv.
Att cmpurile ct i proprietile sunt mrimi de un anumit tip. Un cmp se utilizeaz
pentru a reprezenta o mrime cantitativ asociat obiectului, iar o proprietate pentru a
limita valoarea acesteia la un anumit interval. De exemplu, vom utiliza un cmp pentru a
reprezenta proprietatea Zahar a obiectului Savarin i repectiv o proprietate pentru a
limita valoarea acestui cmp, de exemplu ntre 0 i 6.
Att la cmpuri ct i la proprieti, accesul se poate
face n 2 moduri: public sau privat (private). Un membru
Prjitur
public este accesibil ntregului cod al programului, n timp ce
+Faina: string
un membru privat este accesibil doar codului din interiorul
+Drojdie: bool
clasei. Uzual, cmpurile private sunt acei membri ai clasei ale
+Lapte: bool
cror valori sunt supuse unor restricii. Ei sunt expui restului
+Zahar: byte
codului (adic accesibili) n general prin intermediul unor
+Altele: string
proprieti publice. O reprezentre UML a cmpurilor i
proprietilor poate fi vzut n fig. 3.
Se poate observa c n UML, cea de-a doua caset
Figura 3
este rezervat cmpurilor i proprietilor. Prefixul + este
utilizat pentru a reprezenta caracterul public al cmpului sau
proprietii, iar prefixul pentru a reprezenta caracterul privat. Prefixul este urmat de
numele cmpului sau proprietii i respectiv tipul acestora.
1.2.2 Metode
O metod este o funcie expus de un obiect. Metodele sunt utilizate pentru a
permite accesul la atributele obiectului. Pot fi de asemenea publice sau private. Prin
intermediul metodelor se poate verifica sau modifica starea unui obiect, inclusiv n
situaia n care accesul se face asupra unor atribute private. n UML, metodele sunt
prezentate n caseta a treia (fig. 4).
Prjitur
+Faina: string
+Drojdie: bool
+Lapte: bool
+Zahar: byte
+Altele: string
+AdaugZahar(in cantitate:byte):byte
Figura 4
1.2.3 Constructori
Iniializarea unui obiect este automat, alocarea
memoriei pentru acesta facndu-se fr intervenia programatorului. Rezervarea
memoriei se face de ctre o funcie numit constructor. Constructorul este o funcie
avnd acelai nume cu numele clasei, care treebuie sa fie neaparat public i care poate
sau nu s aib parametri. Orice clas are un constructor implicit, care nu are parametri.
Acest constructor, n cazul utilizrii programelor de tip wizard, este adugat de ctre
acestea i nu mai trebuie definit. n C#, constructorul unui obiect este apelat prin
intermediul cuvntului new.
<<Interface>>
IDulciuri
+Drojdie: bool
+Lapte: bool
+Zahar: byte
+Altele: string
+AdaugZahar(in cantitate:byte): byte
Prajitura
IDulciuri
+Faina: string
Budinca
IDulciuri
+Orez: string
Figura 5
O clas poate utiliza mai multe interfee, iar o interfa poate fi comun mai
multor clase.
1.3.2 Motenirea
Motenirea este cea mai important caracteristic a programrii obiectuale. Prin
intermediul ei, o clas, numit clas
derivat, poate moteni trsturile unei alte
Animal
clase, numit clas de baz, sau superclas,
pe care le poate extinde i eventual
+Hraneste()
modifica. Se pot realiza astfel ierarhii de
+Reproduce()
clase, fr a fi necesar redefinirea fiecri
clase n parte. Spre deosebire de C++, C#
permite doar motenirea simpl. n figura 6
este prezentat o astfel de ierarhie de clase.
Clasa Animal este clasa de baz i expune 2
Pasare
Mamifer
metode: Hraneste() i Reproduce(). Din
aceast clas sunt derivate clasele Pasare i
+Zboara()
+Fuge()
+FaceOua()
+Alapteaza()
Mamifer, care motenesc metodele clasei de
baz, dar adaug fiecare 2 metode noi:
Figura 6
Zboara() i FaceOua(), respectiv Fuge() i
Alapteaz().
S ne reamintim accesibilitatea membrilor clasei. Membrii privai ai clasei de
baz nu vor fi accesibili claselor derivate, n timp ce membri publici vor fi accesibili att
claselor derivate ct i restului codului. Va apare un al treilea tip de acces, respectiv
protejat (protected). Un membru protejat al clasei de baz va fi accesibil claselor
derivate, dar nu va fi accesibil restului codului.
Oricare dintre membrii clasei poate fi definit ca virtual, adic poate fi redefinit
(supranscris) n clasele derivate. Cu alte cuvinte, un membru virtual poate furniza o
implementare alternativ n clasele derivate. Aceast implementare alternativ nu terge
implementarea original din clasa de baz, care rmne accesibil claselor derivate, dar o
ascunde pentru restul codului. Un membru virtual nu poate fi privat, pentru c n acest
caz nu ar fi accesibil claselor derivate pentru a fi redefinit. Dac un membru este virtual,
el va apare n diagrama UML a clasei derivate, avnd evident o alt implementare.
Metoda Hraneste() este implementat virtual n clasa Mamifer (fig. 7).
Exist situaii n care anumite metode virtuale ale clasei de baz nu pot fi
implementate. Ele trebuie declarate, pentru a fi redefinite n clasele derivate. Astfel de
metode se numesc virtuale pure. O clas care conine cel puin o metod virtual pur
este o clas abstract. O clas abstract nu poate fi instaniat, deci nu se pot defini
obiecte de acel tip. n UML numele unei clase abstracte se reprezint prin caractere
italice.
O clas poate fi sigilat (sealed). O
astfel de clas nu poate fi folosit ca i clas
Animal
de baz, sau cu alte cuvinte, din ea nu se pot
deriva alte clase.
+Hraneste()
Ierahia de clase este pus n eviden
+Reproduce()
n numele unei clase prin specificarea
numelui tuturor claselor din amonte,
separate prin punct. Vom avea astfel, n
exemplul nostru Animal.Pasare, respectiv
Animal.Mamifer, .a.m.d.
Pasare
Mamifer
1.3.3 Polimorfismul
+Zboara()
+Fuge()
+Alapteaza()
+FaceOua()
Ca o consecin a motenirii, clasele
+Hraneste()
de baz i clasele derivate pot realiza o
suprapunere a metodelor i proprietilor pe
Figura 7
care le expun. Atfel, obiecte instaniate din
clase avnd aceeai clas de baz, pot fi
tratate n comun. De exmplu, cum clasa Animal expune metoda Hraneste(), aceasta va
putea fi expus prin aceeai sintax de obiecte ale claselor derivate:
Mamifer pisica = new Mamifer();
Pasare vrabie = new Pasare()
pisica.Hraneste();
vrabie.Hraneste();
Mai mult, prin intermediul polumorfismului, vom putea atribui unui obiect al
clasei de baz, un obiect al unei clase derivate, fr a fi nevoie de nici o transformare
explicit de tip:
Animal unanimal = pisica;
unanimal.Hraneste();
0..*
Animal
Animale
Figura 9
implementeaz de obicei metode de tipul Add() i Remove() care adaug sau terg
elemente din colecie. De asemenea, este n general utilizat o proprietate de tip Item,
care returneaz obiectul de la un indice dat. Reprezentarea UML a unei astfel de colecii
poate fi vazut n fig. 9. Prin marcajul 0..* se specific faptul ca colecia Animale va
conine zero sau mai multe obiecte de tip Animal.
O descriere pe larg a POO, n sens clasic, putei gsi n Anexa 1.
1.3.7 Evenimente
Obiectele pot genera evenimente (events). Pentru aceasta, codul va trebui
completat cu un handler (event handler), care n fapt este o funcie special, ce va trebui
apelat pentru generarea unui eveniment specific. Acest funcie, trebuie de asemnea s
fie capabil s asculte (listen) pentru a detecta producerea evenimentului specific. n
acest mod, se poate crea o aplicaie orientat pe evenimente (event-driven). Aplicaiile
Windows sunt n totalitate aplicaii conduse de evenimente. Orice aciune asupra
interfeei, apsarea unui buton, scrierea unei litere, micarea mouse-lui, va genera un
astfel de eveniment. Astfel, intrrile-ieirile din program devin asincrone cu execuia lui.
1.4 S revenim la forme.
E timpul s ncepem s vedem cu ce ne ajut Form Designer n construirea unei
aplicaii Windows.
1.4.1 Toolbox
Prin intermediul Toolbox-ului, programatorul are
la dispoziie toate tipurile de controale necesare pentru
construirea unei aplicaii. Toolbox-ul poate fi
particularizat pentru a satisface nevoile programatorului,
dar pe moment vom studia moful de utilizare al toolboxului implicit.
Figura 10. Toolbox
1.4.2 Controale
Marea majoritate a controalelor sunt obiecte de clase derivate din clasa
System.Windows.Forms.Control. Aceast clas furnizeaz funcionalitatea de baz
pentru controale, de aceea multe din proprietile i evenimentele controalelor, chiar dac
acestea sunt structural diferite, vor fi identice. La rndul lor, clasele care definesc unele
controale, pot fi clase de baz pentru alte controale, mai complexe.
1.4.3 Proprieti ale controalelor
Toate controalele vor dispune de un set de proprieti, care definesc
comportamentul acestora. Clasa de baz Control va furniza un set de proprieti,
motenite i eventual supranscrise de toate controalele. n cele ce urmeaz, vom
prezenta un set de astfel de proprieti, furnizate de clasa Control, deci comune tuturor
controalelor. O descriere detaliat a acestor proprieti poate fi gsit n MSDN.
redimensionarea ferestrei ce-l conine. Ancorarea lui de una din marginile ferestrei va
face ca poziia acestuia fa de marginea respectiv s nu se schimbe. Ancorarea lui
de toate marginile ferestrei va avea ca efect redimensionarea controlului odat cu
redimensionarea ferestrei.
BackColor stabilete culoarea de fond a controlului.
Bottom stabilete distana de la marginea de sus a ferestrei la marginea de jos a
controlului.
Dock ataeaz controlul de una din marginile ferestrei.
Enabled activeaz controlul, adic permite acestuia s recepioneze evenimente de
la utilizator. Dac aceast proprietate este FALSE, controlul este inactiv.
ForeColor definete culoarea textului.
Height definete nlimea controlului.
Left definete marginea stng a controlului, relativ la marginea stng a ferestrei.
Name identificatorul controlului. Poate fi utilizat n cod pentru a individualiza i
accesa controlul.
Parent printele controlului.
Right - definete marginea dreapt a controlului, relativ la marginea stng a
ferestrei.
TabIndex numrul asociat controlului n ordinea de tab. Ordinea de tab stabilete
ordinea in care controalele primesc input focusul (se selecteaz) la apsarea tastei
TAB.
TabStop Stabilete dac controlul primete input focusul la apsarea tastei TAB.
Dac controlul nu are aceast proprietate, la apsarea tastei TAB va fi srit.
Tag este o proprietate care n general nu este utilizat de control. Poate fi doar un
ir de caractere, care este stocat n interiorul controlului.
Top - stabilete distana de la marginea de sus a ferestrei la marginea de sus a
controlului.
Visible dac aceast proprietate este TRUE, controlul este vizibil. n caz contrar,
dei exist n form, el nu poate fi vazut.
Width - stabilete limea controlului.
Click este generat cnd se apas click cu mouse-ul asupra unui control. Poate fi
uneori generat i de apsarea tastei Enter.
DoubleClick este generat cnd se apas dublu click asupra unui control. Dac
10
Proprietatea Text
Figura 11
namespace unu
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
}
}
}
Am adugat clasei Form1 o variabil privat culoare, care este un obiect de clasa
Culoare. n funcia button1_MouseHover(), am atribuit acestei variabile valoarea
atributului BackColor al obiectului button1 i apoi am modivicat valoarea acestui atribut
la culoarea DarkGray. n metoda button1_MouseLeave(), am refcut vechea culoare a
butonului. Astfel, am modificat atributul butonului n mod dinamic. Ce observm?
Atributele unei clase sunt adugate la fel ca i n C++.
Observaii:
1. Observai c n timp ce scriem codul, Form Designer ne ofer informaii asupra
codului i l poate completa singur (la apsarea tastei TAB).
2. Se poate vedea c atributul BackColor l-am modificat n 2 moduri: fie prin intermediul
numelui button1, fie cu secvena ((Button) sender). Este corect oricum, pentru c
handlerul primete n argumentul sender numele obiectului care a generat evenimentul.
12
13
do
k--;
while (k >= 0);
j--;
}
((Button)sender).Width--;
((Button)sender).Height--;
}
}
else
{
((Button)sender).ForeColor = Color.Red;
apasat = false;
for (i = 0; i < 60; i++)
{
((Button)sender).Width++;
((Button)sender).Height++;
}
}
}
14