Upload
others
View
19
Download
0
Embed Size (px)
Citation preview
Concepte
fundamentale ale
limbajelor de
programareLimbaje de programare orientate pe obiecte
Curs 10
conf. dr. ing. Ciprian-Bogdan Chirila
Cuprins
programarea orientata pe obiecte
mostenire
legarea dinamica
programarea orientata-obiect in Java
aspect generale
example
programarea orientata-obiect in C#
programarea orientata-obiect in Lisp
definirea obiectelor si accesarea componentelor
mostenirea de sloturi
mostenirea de metode si transmiterea mesajelor
Introducere in POO
obiecte
orientare-obiect
atasata la fiecare faza de dezvoltare software
proiectare
dezvoltare
testare
componente de medii software
baze de date
sisteme de operare
IDEs
Introducere in POO
dezvoltarea software incepe de la identificarea de
obiecte din lumea reala
rezolvarea problemei inseamna crearea unui model a
acelei realitati
modelul va contine obiecte ce interactineaza intre
ele
obiectele sunt modele ale obiectelor din lumea reala
si a operatiunilor prin care interactioneaza
Introducere in POO
descrierea obiectelor este facuta prin tipuri de date
abstracte
programarea orientata pe obiecte
programul este organizat pe o multime de obiecte
descries prin tipuri abstracte de date
limbaje de programare bazate pe obiecte
Ada, Simula 67, Modula 2
Programare orientata pe
obiecte
conceptul central este obiectul
obiectul are
stare proprie – multime de campuri / atribute
comportament – multime de metode
prin aplicarea metodelor starea obiectului se schimba
starea obiectului este definita prin variabilele sale
in mod implicit ele sunr inaccesibile din exterior
intermediul metodelor accesibile din exterior
obiectele interactioneaza unul cu celalalt
Obiectul
este o instantiere a unei clase
clasa este un constructor de tip ce descrie variabilele
si metodele obiectelor instantiate prin acea clasa
programarea claselor este un concept fundamental
in programarea bazata pe obiecte
programarea orientata pe obiecte are doua trasaturi
in plus
mostenirea
legarea dinamica
Mostenirea
este trasatura ce permite definirea de clase noi ce iau
variabilele de stare
functiile ce dau comportamentul
clasa noua este numita subclasa a celei originale
clasa veche este numita superclasa pentru clasa nou
definita
Mostenirea
permite definirea unei clase fara a o scrie de la zero
aceasta facilitate este valida daca exista deja inca o
clasa cu caracteristici comune
este posibil pentru o superclasa sa aibe
atribute noi
metode noi
attribute redefinite
metode redefinite
conceptul este numite specializare
Exemplu
o stiva ce implementeaza operatia de adaugare
pentru o pereche de elemente
clasa noua va fi implementata ca o extensie a clasei
stiva definita in cursul anterior
Exemplu stack_spec
type stack_spec(nr_max:integer) extends stack=class
operations push_2;
procedure push_2(x,y:integer);
begin
push(x);
push(y);
end;
begin
end;
Exemplu stack_spec
var
st : stack_spec;
------------------------------------------
st := new stack_spec(150);
------------------------------------------
st.push(15);
st.push_2(155,25);
Exemplu stack_spec
type stack_spec_spec(nr_max:integer) extends stack_spec=class
operations under_top,top,pop;
function top():integer;
begin
if not empty() then
return tab_st[ind-1];
else
return –1;
end if;
end;
Exemplu stack_spec
function pop():integer;
begin
if not empty() then
ind:=ind-1;
return tab_st[ind];
else
return –1;
end if;
end;
Exemplu stack_spec
function under_top():integer;
begin
if not empty_spec() then
return tab_st[ind-2];
else return –1;
end if;
end;
Exemplu stack_spec
function empty_spec():boolean;
begin
return ind <= 2;
end;
Exemplu stack_spec
var
st1 : stack = new stack(100);
st2 : stack_spec = new stack_spec(50);
st3 : stack_spec_spec = new stack_spec_spec(80);
i: integer;
i := st1.under_top(); --ilegal
i := st2.under_top(); --ilegal
i := st3.under_top();
Exemplu stack_spec
st1.push_2(150,12); --ilegal
st2.push_2(11,110);
st3.push_2(5,17);
i := st1.top(); --if the stack is empty, an exception is
generated
i := st2.top(); --if the stack is empty, an exception is
generated
i := st3.top(); --if the stack is empty, -1 is returned
Legarea dinamica
st : stack;
i : integer;
with_exception : boolean;
------------------------
if with_exception then
st:=new stack(100);
else
st:=new stack_spec_spec(100);
end if;
------------------------
i:=st.top();
Programarea orientata-
obiect in Java
proiectul a fost lansat la compania Sun in 1990
un limbaj de programare pentru dispositive
electronice domestice
scopul a fost acela de a face programele sa traiasca
pe diferite arhitecturi hardware
din 1993 incepand cu dezvoltarea aplicatiilor web
Java a fost proiectat astfel incat
aplicatiile sa fie executate pe orice calculator
conectat la Internet indifferent de arhitectura sa
Limbajul de programare
Java
a preluat multa sintaxa de la C si de la C++
unele trasaturi au fost eliminate din motive de
securitate
au fost eliminati pointerii
a fost eliminata dealocarea explicita a memoriei
a fost eliminata mostenirea multipla
portabilitatea este bazata pe
compilatorul de Java ce genereaza byte code
codul binary ce poate fi executat pe orice masina
avand o masina virtuala ruland peste ea
Comparatii cu alte limbaje
de programare
inspirat
mai mult din SmallTalk si Eiffel
mai putin din C++
SmallTalk este un limbaj de programare orientat
obiect extrem
opereaza numai cu obiecte chiar si pentru tipurile de
baza
un intreg este un obiect
operatiile intre obiecte sunt transmise ca mesaje
Comparatii cu alte limbaje
de programare
C++ este un limbaj de programare
orientat spre structuri de date
echipat ulterior cu trasaturi orientate-obiect
in Java
toate entitatile sunt obiecte
exceptand tipurile primitive (integer, real, character, boolean)
datele pot fi accesate direct prin nume
obiectele
pot fi accesate indirect prin referinte
must be created explicitly by new operations
trebuie sa fie create explicit prin operatii new
Bibliotecile Java
multime bogata de clase predefinite
dezvoltare rapida a aplicatiilor
set de instrumente de ferestre
ferestre
ferestre dialog
grafica animate: AWT, Swing, JavaFX
conexiuni de retea
evenimente tratate de ascutatorii de mouse
mostenirea si refefinirea permit adaptarea caselor
spre necesitati specifice
Exemplu Java
un program Java este un set de clase
una din ele trebuie sa contina metoda main
necesara ca punct de pornire al programului
pentru applet-uri nu exista metoda main
nevoie de o instanta a clasei java.applet.Applet
la applet
subclasa trebuie sa contina metodele init() si paint()
trebuie sa fie inclusa intr-o pagina web
ruleaza intr-un browser
Exemplu Java
public class Circle
{
protected double x, y, r;
public static int num_circles = 0;
public Circle(double x, double y, double r)
{
this.x=x; this.y=y; this.r=r;
num_circles++;
}
Exemplu Java
public Circle(double r)
{
this(0.0, 0.0, r);
}
public Circle(Circle c)
{
this(c.x, c.y, c.r);
}
Exemplu Java
public Circle()
{
this(0.0, 0.0, 1.0);
}
Exemplu Java
public double circumference()
{
return 2*3.14159*r;
}
public double area()
{
return 3.14159*r*r;
}
Exemplu Java
import java.awt.*;
public class GraphicCircle extends Circle
{
protected Color outline, fill;
public GraphicCircle(double x, double y, double r, Color outline, Color fill)
{
super(x, y, r);
this.outline=outline;
this.fill=fill;
}
Exemplu Java
public GraphicCircle(Color outline, Color fill)
{
this.outline=outline;
this.fill=fill;
}
public void draw(DrawWindow dw)
{
dw.drawCircle(x,y,r,outline,fill);
}
}
Exemplu Java
import java.awt.*;
public class GraphicCircleSmart extends GraphicCircle
{
public GraphicCircleSmart(double x, double y, double r,Color outline, Color fill)
{
super(x, y, r,outline,fill);
}
public GraphicCircleSmart(Color outline, Color fill)
{
super(outline,fill);
}
Exemplu Java
public void draw(DrawWindow dw)
{
super.draw(dw);
dw.drawLine(x-r, y, x+r, y, outline);
dw.drawLine(x, y+r, x, y-r, outline);
}
Exemplu Java
public void put_outline(Color outline)
{
this.outline=outline;
}
public void put_fill(Color fill)
{
this.fill=fill;
}
}
Exemplu Java
--------------------------------------------------
public class DrawWindow
{
------------------------------------
public void drawCircle(double x, double y, double r,Coloroutline, Color fill)
{
---------------------
}
public void drawLine(double x1, double y1, double x2,double y2, Color outline)
{
---------------------
}
}
Exemplu Java
import java.awt.*
public class the_main
{
public static void main (String args[])
{
Color forOutline=new Color( -------);
Color forFill=new Color( -------);
DrawWindow theFirstWd=new DrawWindow(-------);
DrawWindow theSecondWd=new
DrawWindow(-------);
Exemplu Java
Color cl;
double total_area=0;
GraphicCircle tabCircle[]=new GraphicCircle[4];
DrawWindow tabWindow[]=new DrawWindow[4];
tabCircle[0]=new GraphicCircle(1.0, 1.0, 1.0,
forOutline, forFill);
tabWindow[0]=theFirstWd;
Exemplu Java
tabCircle[1]=new
GraphicCircleSmart(forOutline,forFill);
tabWindow[1]=theSecondWd;
tabCircle[2]=new GraphicCircle(forOutline,forFill);
tabWindow[2]=theFirstWd;
Exemplu Java
tabCircle[3]=
new GraphicCircleSmart(5.0, 7.0, 3.0, forOutline,forFill);
tabWindow[3]=theSecondtWd;
Exemplu Java
for(init I=0; I<tabCircle.length; I++)
{
total_area+=tabCircle[i].area();
tabCircle[i].draw(tabWindow[i]);
}
Exemplu Java
cl=new Color (--------);
tabCircle[1].put_outline(cl); //illegal
((GraphicCircleSmart)tabCircle[1]).put_online(cl);
tabCircle[1].draw(theFirstWd);
Comentarii la exemplul Java
exemplul este o aplicatie Java
clasa Circle implementeaza
atributele cercului
metodele
circumferinta
arie
Constructori
3 constructori
metode avand acelasi nume cu clasa
se executa cand este creat un obiect
activarea unuia dintre ei se face pe baza de semnatura
daca nu este definit niciunul atunci exista unul implicit
fara parametri
cu corp vid
are rol de alocare de memorie
Variabile si metode
modificatorii se aplica la membrii claselor
variabile si metode
modificatorul private
vizibil doar in clasa
modificatorul public
vizibil de oriunde
Variabile si metode
atribute ne-statice (dinamice)
asociate cu obiectele
metodele sunt la fel pentru toate obiectele, dar datele
nu sunt
membrii statici
asociati claselor
nu sunt asociati obiectelor !!!
num_circles numara instantierile claselor
Mostenirea
clasa GraphicCircle este subclasa a clasei Circle
extinde metoda draw()
metoda deseneaza un cerc intr-o fereastra data ca
parametru
fereastra este modelata de clasa DrawWindow
culorile sunt modelate de java.awt.Color
awt – Abstract Windowing Toolkit
Swing, SWT - Standard Widget Toolkit, JavaFX
Mostenirea
clasa GraphicCircleSmart este subclasa a clasei
GraphicCircle
extinde clasa cu put_outline si put_fill
redefineste metoda drawing de desenare
clasa “the_main” contine metoda “main”
cele doua tablouri prezente sunt tratate ca si obiecte
dimensiunea tabloului este accesata prin campul
numit “length”
la crearea tabloului fiecare element este null
tabloul tine doar referinte la obiecte
Programarea orientata-
obiect in C#
creat de compania Microsoft pentru platforma .NET
ca si Java este derivat din C si C++
conceptul de portabilitate este luat de la Java
bazat pe limbajul MSIL – Microsoft intermediate language
cadrul de lucru .NET este masina virtuala
programarea se face in mai multe limbaje de
programare
fiecare partea a programului poate fi scrisa in cel mai
expresiv limbaj de programare
integrarea completa cu platforma Windows
Programarea orientata-
obiect in C#
programele C# incep cu functia Main
sistemele C# contin clase
clasele sunt organizate in ierarhii pe baza de
mostenire
legat de mostenire
superclasa sau clasa de baza
subclasa sau clasa derivata
mostenirea multipla nu este permisa
o clasa nu poate avea mai multe superclase
Exemplu de cod C#
using System;
// A class representing bi-dimensional objects.
class Shape2D
{
public double width;
public double height;
public void showDim()
{
Console.WriteLine("Width and height are " + width +" and " + height);
}
}
Exemplu de cod C#
// class Triangle derives from class Shape2D.
class Triangle : Shape2D
{
public string typeOfTriangle;
public double area()
{
return width * height / 2;
}
public void showType ()
{
Console.WriteLine("Triangle is " + typeOfTriangle);
}
}
Exemplu de cod C#
class Shapes
{
public static void Main()
{
Triangle t1 = new Triangle();
t1.width = 4.0;
t1.height = 4.0;
t1.typeOfTriangle = "isosceles";
Exemplu de cod C#
Triangle t2 = new Triangle();
t2.width = 8.0;
t2.height = 12.0;
t2.typeOfTriangle = "rectangular";
Exemplu de cod C#
ConsoleWriteln("Information about t1: ");
t1.showType();
t1.showDim() ;
Exemplu de cod C#
ConsoleWriteLine("Triangle area is " + t1.aria());
ConsoleWriteLine();
ConsoleWriteln("Information about t2: ");
t2.showType();
t2.showDim() ;
ConsoleWriteLine("Triangle area is " + t2.aria());
}
}
Comentarii
Clasa Shape2D
defineste atributele unei forme generice
Square
Rectangle
Triangle
Clasa Triangle
este derivata din Shape2D
un atribut a fost adaugat: typeOfTriangle
doua metode au fost adaugate: area(), showType()
este capabila de a referi atributele de tip Shape2D ca fiind proprii
Bibliografie
Horia Ciocarlie – The programming language universe,
second edition, Timisoara, 2013
Carlo Ghezzi, Mehdi Jarayeri – Programming
Languages, John Wiley, 1987.
Ellis Horrowitz – Fundamentals of programming
languages, Computer Science Press, 1984.
Donald Knuth – The art of computer programming,
2002.