Sunteți pe pagina 1din 20

Ciocnire intre 2 obiecte in limbajul C#.

ELEV: PROFESOR COORDONATOR:


POTA TEFANEL OANCEA CECILIA

AN COLAR:
2016-2017
Cuprins
1.Motivul alegerii temei..1
2.Ciocnirea perfect elastica.2
3.Structura programului..3
4.Secventa de cod...4
5. Introducere in C#....11
6.Bibliografie..18
Motivul alegerii temei
Am ales sa creez un program care sa simuleze un fenomen fizic
deoarece ,dupa informatica , fizica este a doua cea mai mare
pasiune a mea si m-am gandit sa imi combin cele doua pasiuni
intr-un singur program ce creaza fenomene asemanatoare
ciocnirii perfect elastice intre doua obiecte .

1
Ciocnirea perfect elastica
In ciocnirea perfect elastica energica cinetica se conserva. In natura nu
existaciocnire perfect elastica, dar in multe situatii ciocnirile reale pot fi
considerate elastice(de exemplu ciocnirea a doua bile de otel).Sa consideram cazul
unidimensional a doua corpuri. Acest caz presupune ca,atat inainte, cat si dupa
ciocnire cele doua corpuri se misca pe aceeasi dreapta.

2
Structura Programului
Programul consta in configurarea vitezei si masei fiecarui obiect si miscarea
sus/jos prin intermediul sagetiolor .

Dupa apasarea butonului START obiectele vor simula aproximativ procesul


de ciocnire perfect elastic intre doua obiecte , Dupa cocnire ,obiectele nu vor mai fi
actionate de nicio forta, deci se vor opri in functie de forta cu care au fost lovite .

Prin apasarea butonului RESETARE ,obiectele vor reveni la pozitia initiala


pentru a le configure o alta pozitie ,masa si viteza.

3
Secventa de cod
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Threading.Tasks;

namespace Atestat_1
{
public partial class form5 : Form
{ int mx, my,a;
double x1=10, y1=175, x2=620, y2=175,v3y,v4y, alfa,
beta,coef1=0.97f,coef2=0.97f, v1,v2,m1,coef3,m2,sem=1,v3,v4,v3sec
,v4sec;

private void button3_Click(object sender, EventArgs e)


{
x1 = 10; y1 = 175; x2 = 620; y2 = 175;
obj1.Location = new Point((int)x1, (int)y1);
obj2.Location = new Point((int)x2, (int)y2);
timer2.Stop();
timer1.Stop();

private void panel1_Paint(object sender, PaintEventArgs e)


{
e.Graphics.DrawLine(new Pen(Color.Black), 0, 209, 700,
209);
}

bool dif;
private void pictureBox4_MouseUp(object sender, MouseEventArgs
e)
{
timer3.Stop();

4
}

private void pictureBox3_MouseUp(object sender, MouseEventArgs


e)
{
timer3.Stop();
}

private void pictureBox4_MouseDown(object sender,


MouseEventArgs e)
{
a = 4;
timer3.Start();
}

private void pictureBox3_MouseDown(object sender,


MouseEventArgs e)
{
a = 3;
timer3.Start();
}

private void pictureBox2_MouseDown(object sender,


MouseEventArgs e)
{
a = 2;
timer3.Start();
}

private void pictureBox2_MouseUp(object sender, MouseEventArgs


e)
{
timer3.Stop();
}

private void timer3_Tick(object sender, EventArgs e)


{if (a==1)
obj1.Location = new Point(obj1.Location.X, obj1.Location.Y
- 1);
if(a == 2)
obj1.Location = new Point(obj1.Location.X,
obj1.Location.Y +1);
if (a==3)
obj2.Location = new Point(obj2.Location.X,
obj2.Location.Y - 1);
if (a==4)

5
obj2.Location = new Point(obj2.Location.X,
obj2.Location.Y + 1);
y1 = obj1.Location.Y;
y2 = obj2.Location.Y;
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs


e)
{
timer3.Stop();

private void pictureBox1_MouseDown(object sender,


MouseEventArgs e)
{
a = 1;
timer3.Start();
}
private void timer2_Tick(object sender, EventArgs e)
{
obj1.Location = new Point((int)x1, (int)y1);
obj2.Location = new Point((int)x2, (int)y2);
x1 = x1 - v3 ;
x2 = x2 + v4 ;
v3 *= coef1;
v4 *= coef2;
y1 = y1 - v3y;
y2 = y2 + v4y;
v3y *= coef1;
v4y *= coef2;

private void obj2_Paint(object sender, PaintEventArgs e)


{
System.Drawing.Drawing2D.GraphicsPath imgp =new
System.Drawing.Drawing2D.GraphicsPath();
System.Drawing.Rectangle ob2 = obj2.ClientRectangle;
ob2.Inflate(-10, -10);
e.Graphics.DrawEllipse(System.Drawing.Pens.Black, ob2);
ob2.Inflate(1, 1);
imgp.AddEllipse(ob2);
obj2.Region = new System.Drawing.Region(imgp);

6
}

private void obj1_Paint(object sender, PaintEventArgs e)


{
System.Drawing.Drawing2D.GraphicsPath imgp2 = new
System.Drawing.Drawing2D.GraphicsPath();
System.Drawing.Rectangle ob1 =obj1.ClientRectangle;
ob1.Inflate(-10, -10);
e.Graphics.DrawEllipse(System.Drawing.Pens.Black, ob1);
ob1.Inflate(1, 1);
imgp2.AddEllipse(ob1);
obj1.Region = new System.Drawing.Region(imgp2);

private void Form5_Load(object sender, EventArgs e)


{

tm1.Text = tm2.Text = tv1.Text = tv2.Text = 2.ToString();

public form5()
{
InitializeComponent();
}private void button1_Click(object sender, EventArgs e)
{
m1=Convert.ToInt32(tm1.Text);
m2 = Convert.ToInt32(tm2.Text);
v1 = Convert.ToInt32(tv1.Text);
v2 = Convert.ToInt32(tv2.Text);

timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)


{
obj1.Location = new Point((int)x1,(int) y1);
obj2.Location = new Point((int)x2, (int)y2);

x1 = x1 + v1;

7
x2 = x2 - v2;
if (obj1.Location.Y == obj2.Location.Y)
{
if (obj1.Location.X + obj1.Width - 18 >=
obj2.Location.X)
{
v3 = Math.Abs((2 * (m1 * v1 + m2 * v2) / (m1 +
m2)) - v1);
v4 = Math.Abs((2 * (m1 * v1 + m2 * v2) / (m1 +
m2)) - v2);
if (m1 > m2)
{
if (m1 <= 10 * m2)
{
v3 -= v3 * ((float)(1 - (m2 / m1)));
v4 += v4 * ((float)(1 - (m2 / m1)));

}
if (m1 > 10 * m2)
{
v3 -= Math.Abs(2 * v3 * (m2 / m1 - 1));
v4 += Math.Abs(v4 * ((m2 / m1) / 2 - 1));

}
}
else if (m2 > m1)
{
if (m2 <= 10 * m1)
{
v3 += v3 * (1 - (m1 / m2));
v4 -= v4 * (1 - (m1 / m2));
}
if (m2 > 10 * m1)
{
v4 -= Math.Abs(2 * v4 * (m1 / m2 - 1));
v3 += Math.Abs((v4) * ((m1 / m2) / 2 -
1));

8
timer2.Start();
timer1.Stop();
}
}
else
{
if (obj1.Location.Y < obj2.Location.Y)
if (obj1.Location.X + obj1.Width - 18 >=
obj2.Location.X && obj2.Location.Y - obj1.Location.Y < 48)
{
alfa = (double)(obj2.Location.Y -
obj1.Location.Y) / 29;

if (alfa < 0.78)


{
v3sec = Math.Abs((2 * (m1 * v1 + m2 * v2)
/ (m1 + m2)) - v1);
v4sec = Math.Abs((2 * (m1 * v1 + m2 * v2)
/ (m1 + m2)) - v2);
v3 = v3sec * Math.Cos(alfa);
v3y = v3sec * Math.Sin(alfa);
v4 = v4sec * Math.Cos(alfa);
v4y = v4sec * Math.Sin(alfa);
}
if (alfa > 0.78)
{
v3sec = v1;
v4sec = v2;

v3 = -v3sec * Math.Sin(alfa);
v3y = v3sec * Math.Cos(alfa);
v4 = -v4sec * Math.Sin(alfa);
v4y = v4sec * Math.Cos(alfa);
}

timer2.Start();

timer1.Stop();
}
if (obj1.Location.Y > obj2.Location.Y)
if (obj1.Location.X + obj1.Width - 18 >=
obj2.Location.X && obj1.Location.Y - obj2.Location.Y < 48)
{
alfa =(double)(obj1.Location.Y -
obj2.Location.Y) / 29;

9
if (alfa < 0.78)
{v3sec = Math.Abs((2 * (m1 * v1 + m2 * v2) /
(m1 + m2)) - v1);
v4sec = Math.Abs((2 * (m1 * v1 + m2 * v2) /
(m1 + m2)) - v2);
v3 = v3sec * Math.Cos(alfa);
v3y = -v3sec * Math.Sin(alfa);
v4 = v4sec * Math.Cos(alfa);
v4y = -v4sec * Math.Sin(alfa);
}
if(alfa >0.78)
{
v3sec = v1;
v4sec = v2;
v3 = -v3sec * Math.Sin(alfa);
v3y = -v3sec * Math.Cos(alfa);
v4 = -v4sec * Math.Sin(alfa);
v4y = -v4sec * Math.Cos(alfa);
}

timer2.Start();

timer1.Stop();

}
}

10
Introducere in C#
C# este un limbaj de programare conceput pentru a se putea crea cu ajutorul sau
o gama variata de programe. care pot fi rulate folosind .NET framework. C# este un
limbaj simplu, puternic tipizat. C# este limbaj de programare care foloseste paradigma
programarii orintate pe obiecte. Cu multele sale inovatii C# permite dezvoltarea rapida
de aplicatii retinand de asemenea expresivitatea si eleganta limbajelor bazate pe sintaza
C.

.NET framework pune la dispozitie o gama larga de operatii care se pot executa
care accelereaza timpul de dezvoltare a unei aplicatii. Aceste operatii sunt realizate cu
ajutorul unor clase bine proiectate.

Dupa compilarea unui program C# acesta este transcris in IL


(Intermediate Language). In acest fel cu ajutorul CTS (Common Type System) si CLS
(Common language specification) acelasi program poate fi create in oricare limbaj care
suporta .NET framework astfel intre .NET framework si C# exista o legatura bijectiva.

Avantajele folosirii .NET framework:

POO NET. framework si C# sunt bazate in intregime pe paradigma


programarii orientate pe obiecte din start

Un bun design Toate clasele din .NET framework sunt construite din
start intr-o maniera intuitiva si eficienta

Multilimbaj Toate programele din orice limbaj care suporta .NET


framework sunt compilate intr-un limbaj comunIntermediate Language
astfel aceste limbaje sunt interoperabile intr-un mod in care nu au mai fost
pana acum

Un bun suport pentru paginile web dinamice

Un bun suport pentru accesul la date Un de componente .NET cunoscut


sub numele de ADO.NET asigura accesul la bazele de date relationale. Alte
componente asigura accesul la fisiere, directoare si XML.

Securitate imbunatatita

Instalare foarte usoara a programelor create in .NET datorita suportului


oferit pentru versiuni si faptului ca .NET este multiplatforma

Suport pentru servicii web

11
Rezultatul compilarii unui program din C# este un assembly sau un modul, din mai
multe module putandu-se crea un assembly.Un assembly este o unitate care se descrie
singura avand toate informatiile necesare folosirii acestuia in interiorul sau. De exemplu
are informatii despre: tipurile care sunt definite, versiunea sa, alte assembly care sunt
necesare etc. Acelasi assembly poate fi incarcat de mai multe ori in memoria folosita de
acelasi proces daca versiunile acestui assembly sunt diferite. Assembly-urile sunt de doua
tipuri: private si publice. Assembly-urile private sunt folosite de o singura aplicatie iar
pentru instalarea acestui tip de assembly este necesara doar copierea acestuia in
directorul aplicatiei. Assembly-urile publice pot fi folosite de mai multe aplicatii iar pentru
instalarea lor trebuie urmata o procedura speciala acestea fiind instalate in GAC (Global
Assembly Cache). Pentru instalarea acestor assembly este nevoie de o cheie privata la
care are acces numai cel care instaleaza assembly-ul dorit. Daca se doreste inlocuirea
acestui assembly el nu poate fi inlocuit decat daca se cunoaste cheia privata cu care a
fost instalat. Acesta metoda de instalare este una din multele metode prin care .NET
incearca sa imbunatateasca securitatea aplicatiilor.

2 Clase. Obiecte. Proprietati. Metode

Toate tipurile din .NET framework(inclusiv din C#) au o clasa de baza din care
sunt derivate, aceasta clasa se numeste object. In C# este facuta distinctia intre tipurile
valoare si referinta. Variabilele de tip valoare sunt retinute pe stiva. Variabilele de tip
referinta se memoreaza in managed heap. Continutul unei variabile de tip valoare
este chiar valoarea care trebuie retinuta de tip. Exemple de tipuri valoare: int, float,
unsigned int etc. Alte tipuri valoare sunt cele declarate ca fiind struct sau enum.
Continutul unei variabile de tip referinta este o referinta catre locul unde se retine
informatia propriu-zisa. Exemplu tip referinta : tipul string.

Pana la aparitia programarii orientate pe obiect programele erau implementate in


limbaje de programare procedurale(C, Pascal) sau in limbaje care nici macar nu ofereau
o modalitate de grupare a instructiunilor in unitati logice(functii, proceduri) cum este cazul
limbajului de asamblare(assembler). Altfel spus o problema preluata din natura trebuia
fragmentata in repetate randuri astfel incat sa se identifice elementele distincte,
implementabile intr-un limbaj de programare. O mare problema a programarii
procedurale era separarea datelor de unitaile care prelucrau datele(subrutinele), ceea ce
facea foarte dificila extinderea si intretinerea unui program. Astfel s-a pus problema ca
aceste doua entitati(date si subrutine) sa fie grupate intr-un anumit mod, astfel incat
subrutinele sa 'stie' in permanenta ce date prelucreaza si, mai mult decat atat, ele sa
formeze un modul, adica o unitate care separa implementarea de interfata, ceea ce
implica posibilitatea refolosirii codului. A aparut astfel conceptul de clasa. Clasa realizeaza,
in speta, ceea ce am vazut mai inainte: grupeaza datele si unitatile de prelucrare a
acestora intr-un modul, unindu-le astfel intr-o entitate mult mai naturala. Desi tehnica se
numeste 'Programare Orientata Obiect', conceptul de baza al ei este este Clasa. Clasa, pe
langa faptul ca abstractizeaza foarte mult analiza/sinteza problemei are proprietatea de
generalitate, ea desemnand o multime de obiecte care impart o serie de proprietati.

12
De exemplu: Clasa 'floare' desemneaza toate plantele care au flori, precum clasa
'Fruct' desemneaza toate obiectele pe care noi le identificam ca fiind fructe. Bineinteles,
in implementarea efectiva a programului nu se lucreaza cu entitati abstracte, precum
clasele ci se lucreaza cu obiecte, care sunt 'instantieri' ale claselor. Altfel spus, plecand
de la exemplul de mai sus, daca se construieste un program care sa lucreze cu fructe, el
nu va prelucra entitatea 'fruct' ci va lucra cu entitati concrete ale clasei 'fruct', adica 'mar',
'para', 'portocala', etc.

Apare insa urmatoarea problema: 'cum se trece de la o structura generala la una


particulara, mai precis ce inseamna efectiv procesul de
instantiere?'. Instantierea(trecerea de la clasa la obiect) inseamna atribuirea unor
proprietati specifice clasei, astfel incat aceasta sa indice un obiect anume, care se
diferentiaza de toate celelalte obiecte din clasa printr-o serie de atribute. Daca vom
considera ca 'fruct_exotic' care desemneaza clasa tuturor fructelor exotice contine
proprietatea 'culoare' atunci atribuind acesteia valoarea 'galben' noi vom crea o
noua multime( clasa fructelor exotice care au culoarea galbena ) care este o subclasa a
clasei 'fruct_exotic', deci realizam astfel o particularizare. Mai mult decat atat, daca vom
adauga noi si noi atribute vom individualiza clasa astfel incat sa ajungem la un caz
concret, care este Obiectul.

Sa consideram in continuare ca in magazin avem si fructe care trebuie pastrate la


temperaturi joase. Pentru ele vom avea nevoie de un raft special. Acest nou raft(sa-l
numim raft frigorific) este in esenta tot un raft doar ca are in plus proprietatea de racire.
Acest lucru ne duce cu gandirea la faptul ca putem reutiliza codul scris pentru 'Raft' pentru
a implementa o clasa numita 'RaftFrigorific'. Altfel spus, dorim ca noua noastra clasa sa
fie o subclasa a clasei 'Raft' deoarece ea 'are toate proprietatile clasei 'Raft' plus altele
particulare, care o diferentiaza'. Acest lucru, in mod intuitiv, este numit mostenire.
Mostenirea este o relatie statica(definita in momentul programarii) care pune in legatura
o clasa cu alta(sau mai multe) astfel incat clasa rezultata sa 'preia' toate atributele
clasei/claselor pe care o/le mosteneste. Clasa care mosteneste atributele altei clase se
numeste 'clasa derivata' iar clasa care are mostenitori se numeste 'clasa de baza'.
Terminologia este, si in acest caz, intuitiva. Unul din avantajele mostenirii, care se observa
direct, este acela al reutilizarii codului: clasa derivata nu va mai implementa metodele
clasei de baza, ci va implementa numai metodele ei specifice; mai mult clasa derivata va
contine (prin intermediul mostenirii) toate atributele(date si subrutine sau 'metode') ale
clasei de baza. Astfel spus si clasa 'RaftFrigorific' va avea atributele 'numar' si 'continut'.
Mostenirea este de asemeni o relatie fundamentala in programarea orientata pe obiecte,
care este recunoscuta ca fiind un principiu de baza, alaturi de incapsulare, si polimorfism.

Am vazut mai sus ca o clasa poate mosteni o alta clasa, ceea ce inseamna ca o
entitate preia toate atributele altei entitati. Putem avea, de asemeni, mai multe clase care
mostenesc o clasa. Fie clasa 'A' si clasele 'B', 'C' si 'D'; sa presupunem ca 'B', 'C', 'D'
mostenesc pe 'A'. In acest caz putem face afirmatia: 'B, C si D sunt de tip A'. Aceasta

13
inseamna ca B, C si D mostenesc toate caracteristicile clasei A deci pot fi identificate cu
o clasa de tip A.

Facand o analogie cu exemplul anterior, daca A -> 'Fruct', B -> 'mar', C -> 'nuca',
D -> 'pruna', afirmatia de mai sus ar suna in felul urmator: 'marul, para si nuca sunt
fructe', lucru care este in mod evident adevarat. Dar sa consideram urmatoarea situatie:
'Fruct' poate implementa o subrutina pe care o vom numi 'mananca-ma!'. Deoarece, prin
mostenire, clasele 'Mar', 'Par' si 'Nuca' preiau toate atributele clasei 'Fruct', deci si
subrutina 'mananca-ma!' inseamna ca un mar se mananca la fel ca o pruna! Bineinteles,
daca incercam sa muscam cu pofta dintr-o nuca Asta inseamna ca 'mananca-ma!' trebuie
sa se particularizeze pentru fiecare clasa in parte, reflectand un comportament adecvat
cu proprietatile acesteia. Acest lucru mai este numit si polimorfism.

El este al treilea si cel mai important principiu al programarii orientate pe obiecte.


El asigura faptul ca fiecare clasa se comportadiferit(polimorfic) la un anumit mesaj trimis
catre obiect(in cazul nostru, apelul subrutinei 'mananca-ma!'). Se observa ca
polimorfismul exista in stransa legatura cu mostenirea, fara de care nu ar exista. El aduce
insa o nuanta mostenirii: 'Preiau din clasa de baza doar acele proprietati care sunt comune
si reflecta un comportament adecvat structurii mele'. Altfel spus, prin polimorfism pot
face o mostenire selectiva.

In C# exista o mare diferenta intre clase si structuri. Clasele sunt de tip referinta
iar structurile sunt de tip valoare. Structurile pot avea si acestea constructori dar la
structuri poate fi definit un constructor care nu are nici un parametru. Aceasta restrictie
este datorata faptului ca campurile structurilor sunt implicit initializati cu valoarea lor
neutra. De exemplu membrii de tip int sunt initializati implicit cu zero, cei de tip bool cu
false iar membrii de tip referinta cu null.

In C# clasa poate avea: campuri. metode, proprietati, evenimente. Proprietatile


sunt o inovatie adusa in C# fata de C++. In C++ pentru a incapsula un camp era nevoie
sa se scrie functii Get/Set. Aceste functii aveau rolul de a regasit/schimba continutul unui
membru al clasei. Aceste functii Get/Set sunt inlocuite in C# de proprietati. Acestea
permint utlizatorului clasei sa afle/schimbe valoarea campurilor prin proprietati acestea la
randul lor fiind asemanatoare ca utilizare unor campuri obisnuite dintr-o
clasa. Proprietatile pot avea la randul lor permisiunile de acces obisnuite in C#: public,
protected, private, internal si internal protected. Permisiunile de acces public, private,
protected sunt deja cunoscute pentru utlizatorii C++ noutatea vine in cazul permisiunii
internal. Membrii care sunt etichetati internal sunt vizibili de oriunde din assembly-ul unde
au fost definiti. Membrii internal protected sunt ca si cei internal sau ca si cei proctected
adica pot fi vizibili de oriunde din assembly-ul unde au fost declarati dar si din clasele
derivate care nu sunt neaparat definite in acelasi assembly unde au fost declarati membrii
internal protected. O proprietate poate fi de mai multe tipuri: read/write, read-only sau
write-only (caz nerecomdat, recomandat sa se foloseasca o functie in acest caz). Prin
proprietate read/write se intelege ca se poate citi/scrie in campul pe care proprietatea o

14
exporta, o proprietate read-only poate doar sa citeasca ce contine campul pe care aceasta
il exporta. Un nou lucru adus in plus fata de C++ sunt delegatii si evenimentele. Delegatii
pot fi comparati cu pointerii la functii din C/C++ cu exceptia faptului ca delegatii sunt
puternic tipizati. In C# se pot crea instante la un delegat definit luand ca paramentru
functia care va fi folosita de acea instanta a delegatului.

3 Evenimente

In programarea de windows sunt folosite evenimentele. De exemplu cand


utilizatorul da click pe o ferestra programatorul scrie functia in care se suprascrie
evennimentul WM_MOUSECLICK. Pentru majoritatea actiunilor care se desfasoara asupra
unei ferestre sunt definite evenimente acestea fiind captate de catre programator
raspunzandu-se numai la care este nevoie sa se execute o actiune particulara. Cand ceva
interesant se intampla intr-un obiect sunt sanse mari ca alte obiecte sa fie interesate de
acest lucru. Din nou evenimentele vin ajutorul programatorului. La fel precum .NET
framework foloseste evenimentele de windows la fel se pot folosi evenimentele din C#
ca mijloc de comunicare intre obiectele diferitelor clase. Evenimentele din C# folosesc
delegatii pentru a se putea suprascrie ce actiune sa se execute cand un eveniment are
loc. Un eveniment poate fi receptionat sau trimis. Modalitatea de a trimite un eveniment
este diferita fata de modalitatea de a receptiona un eveniment. Un delegat care este
folosit pentru un eveniment ia ca parametru o functie cu doi paramentri. Primul parametru
reprezinta obiectul care a trimis evenimentul tipul acestuia este object, iar cel de-al doilea
paramentru reprezinta informatia despre eveniment. Tipul celui de-al doilea paramentru
este o clasa care trebuie sa fie derivata din clasa EventArgs.

4 Interfete

O alta noutate adusa in C# fata de C++ o reprezinta interfetele. Intr-o interfata


sunt declarate functii, propritati, evenimente etc. care trebuie implementate in clasa care
foloseste interfata. Membrii unei interfete nu au nici un modificator de acces. In clasele
care implementeaza interfetele membrii care sunt definiti in interfete trebuie trecuti in
clasa cu modificatorul de acces public. Interfetele permit ca se foloseasca in mod
asemanator clase care nu au nici o legatura directa. Interfetele garanteaza ca toate
clasele care le implementeaza vor avea aceleasi functii care functioneaza in acelasi fel
chiar daca clasele sunt diferite singurul punct comun fiind reprezentat de
interfete.Interfetele pot fi privite ca un contract intre doua parti. O parte obligandu-se sa
faca un anumit lucru stabilit de la inceput (aceasta parte fiind clasa) iar cealalta parte
stiind exact ce poate fi folosit de oricine care semneaza acest contract(partea care
foloseste clasa prin intermediul interfetei).

5 Colectii. Generics. Atribute

15
Un nou lucru adus in C# fata de C++ este introducerea tipului string. Acesta
memoreaza siruri de caractere unicode. Are multime de functii care ajuta la manipularea
mai usoara a sirurilor. De asemenea este o introdusa o clasa pentru expresii regulare.

In C# colectiile de date fac parte din biblioteca standard. Acesta biblioteca include
clase pentru lista simplu inlantuita, dublu inlantuita, stiva, hash etc. Aceste clase sunt
usor de utilizat si ofera un bun randament atat ca rapiditate cat si management al
memoriei folosite.

Un concept nou adus in versiunea 2.0 fata de versiunea 1.0 a .NET framework
sunt generics. Un concept asemenator gasim de asemenea si in C++ prin template. Dar
spre deosebire de C++ in C# se pot scrie librarii care folosesc generics, in C++ pentru
folosirea template-urilor era nevoie de codul sursa pentru a crea program neputandu-se
crea librarii folosindu-se template-uri. Faptul ca in C# (.NET) se pot scrie librarii este
datorat CLR. CLR(Common Language Runtime) transforma codul IL in instructiuni care
pot fi intelese de procesor. Astfel nu conteaza ce tip este folosit cu generics datorita
faptului ca CLR transform IL in timpul rularii programului in cod care poate fi inteles direct
de procesor. Generics poate fi folosit la metode, delegati, clase etc.

Un nou lucru adus in C# (.NET framework) sunt atributele. Folosind atributele se


poate nota informatii despre o clasa, metoda, camp, etc direct in assembly. Aceste
notatii pot fi apoi regasite si folosite pentru a indeplini diferite roluri. De exemplu cu un
atribut se poate spune ca o functie sa fie folosita numai daca programul este compilat in
Debug.

O alta nouatate adusa in C# ( .NET) este procesul de reflection. Prin acest proces
se pot afla informatii despre ceea ce se gaseste intr-un assembly. Folsind procesul de
reflection se poate gasi ce tipuri sunt definite intr-un assembly, ce metode campuri, etc
au tipurile respective, ce atribute sunt folosite si pentru ce tipuri, campuri etc. versiunea
unui assembly etc.

6 Fisiere. Serializare

In .NET ca de asemenea in C++ sunt folosite fluxurile de date. In .NET acest lucru
este realizat indeosebi folosing clasa de baza Stream. Din aceasta clasa abstracta sunt
derivate alte clase care sunt folosite pentru fluxurile de date, fiecare fiind specializata:
pentru fisiere, pentru memorie, pentru retea, pentru comprimare, pentru criptare etc.

Un alt lucru care vine in ajutorul programatorului este folosirea serializarii. Prin
serializare se intelege in genereal trecerea (transferul) starii unui obiect din memorie intr-
un flux de date (stream). Deserializarea este este procesul invers al serializarii adica
trecerea (transferul) din fluxul de date intr-un obiect. Serializarea se realizeaza cu
ajutorul fluxurilor de date, de aici rezultand ca un obiect poate fi serializat intr-un fisier,
pe retea, in memorie etc. Pentru a marca o clasa ca sa poate fi serializara este necesara

16
folosirea atributului [Serializable]. Daca nu se doreste (nu este posibil) ca un camp sa fie
serializat acesta trebuie sa fie marcat cu atributul [NonSerialized]. In procesul de
serializare se folosesc object graphs. Un object graphs este alcatuit din obiectul care va
fi serializat alaturi de toate datele necesare seralizarii lui (inclusiv alte tipuri cu care clasa
obiectului are o relatie).

Exista mai multe feluri cum poate fi retinute obiectele serializate. Pot fi serializate
folosind BinaryFormatter astfel rezultand un sir de bytes in care este retinut obiectul,
acest tip nu tine cont de modificatorii de acces aplicati asupra campurilor clasei din care
face parte obiectul care va fi serializat. Un alt tip este SoapFormatter care foloseste SOAP
pentru a serializa un obiec dar SoapFormatter serializeaza numai campurile care sunt
declarate publice sau care sunt exportate prin proprietati publice. Acelasi lucru se
intampla folosind XmlSerializer singura diferenta fata de SoapFormatter fiind faptul ca se
foloseste XML pentru a serializa obiectul dorit. Fiecare din aceste tipuri au doua functii
Serialize si Deserialize una pentru a serializara respectiv pentru a deserializa.

7 Concluzii

Programarea orientata obiect este unul din cei mai importanti pasi facuti in evolutia
limbajelor de programare spre o mai puternica abstractizare in implementarea
programelor. Ea a aparut din necesitatea exprimarii problemei intr-un mod mai natural
fiintei umane. Astfel unitatile care alcatuiesc un program se apropie mai mult de modul
nostru de a gandi decat modul de lucru al calculatorului.

Limbajul C# este un limbaj puternic tipizat, acceptand paradigma de programare


orientata pe obiecte. In C# se pot dezvolta aplicatii foarte rapid, avand o bibleoteca de
clase bine organizata fiind intuitiva pt utilizator. Se pot realiza aplicatii pe mai multe
domenii (baze de date, comunicare prin retea, comunicare pe serial, etc.). Securitatea
este mult inbunatatita fata de aplicatii clasice care nu ruleaza pe platforma .NET. Practic
prin C# s-a trecut la un alt nivel de programare.

17
Bibliografie
1. http://www.qreferat.com/referate/informatica/METODE-VIZUALE-
C418.php
2. Curs de C# - Programare n Visual C# 2008 Express Edition,
Autori : Constantin Glan,Susana Glan;
Editura: L&S INFOMAT

18

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