Concepte fundamentale ale limbajelor de...

Preview:

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.

Recommended