Download - ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Transcript
Page 1: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Paradigma Orientata Obiect

ouape

Page 2: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

2

Descompunerea functionala se muta la top down/bottom up

• O maniera naturala pentru gestiuneacomplexitatii unei probleme

• Exemplu: Sa se acceseze descrierea unor formeexistenta intr-o baza de date si apoi sa se afisezeaceste forme

• O prima abordare ar fi:1. Identifica lista de forme in baza de date

2. Deschide lista de forme din baza de date

3. Ordoneaza aceasta lista conform cu un set de reguli

4. Afiseaza formele pe monitor

Page 3: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

• Detailere la pasul 4

– Identifica tipul formei

– Obtine locatia acesteia

– Apeleaza functia care poate sa afiseze aceastaforma (poilorfism?) furnizandu-I locatia formei

• Se observa ca ideea este sa descompunemproblema pana la elementele functionale / pasii care o compun

Page 4: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

specificatiile

• Sunt:– Incomplete

– De multe ori gresite partial sau total

– Inselatoare (din cauza diferentelor de limbaj sireprezentare a unor concepte dintre proiectant sibeneficiar

– Niciodata nu prind toate aspectele implicate

Page 5: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

5

Tratarea schimbarilor in descompunereafunctionala

functie : afiseaza formadisplay shape

intrare: tip de forma, descriere de forma

actiune:switch (tipul formei)

case patrat: apeleaza functia care afiseaza un patrat

case cerc:

peleaza functia care afiseaza un cerc

Page 6: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

6

Coeziune scazuta si cuplarea stransa• Telul ar fi

– Sa se creeze functii• cu integritate interna (coeziune stransa)

• Care au relatii directe, vizibile, flexibile si directe (nu prinintermediari) (strans cuplate)

• Efecte colaterale– Nedorit

– Dorit:

Page 7: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

7

Proiectarea orientata obiect

O metodologie orientata pe rezolvareaproblemei care produce o solutie a problemeiin termeni de entitati incapsulate numiteobiecte

Obiect

O entitate sau un lucru care are sens in contextul problemei

De exemplu un student, o masina, o data si o ora

Page 8: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

8

Privire generala

Problemele sunt rezolvate prin

• Izolarea obiectelor implicate

• Determinarea proprietatilor si actiunilor (sauresponsabilitatilor) acestora si

• Descrierea colaborarii intre obiecte cu scopulrezolvaii problemei

Page 9: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

9

Exemplu

Tu si cu prietena stabiliti o “intalinire de lucru”Obiecte: tu, prietena, cinaClasa: tu si cu prietena sunteti oameni

Oamenii au nume, culoare ochi etc… Oamenii pot face cumparaturi, gati

Instanta clasei: tu si cu prietena sunteiti instante ale clasei Oameni. Fiecare

aveti propriul nume, culoare a ochilor etc siputeti gati sau face cumparaturi

Voi colaborati la pregatirea mesei

Page 10: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

10

Definitii primare

Clasa (sau obiectul clasei)O descriere a unui grup de obiecte similareObiect (instanta unei clase)Un caz concret al modelului definit in clasaClasele contin campuri care reprezinta

proprietati (numele, culoarea ochilor) siComportamente (responsabilitati) (gateste, face

cumparaturi) ale clasei

MetodaUn algoritm care defineste comportamentul (gateste,

face cumparaturi)

Page 11: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

11

Proiectarea orientata obiecte

Proiectare Top-Down

descompune problema in task-uri

Proiectare Orientata obiect

descompune problema in obiecte care colaboareaza

Page 12: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

12

Top-Down vs proiectare OO

Abordarea Top-down Abordarea Orientat Obiect

Page 13: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

13

Proiectarea OO - “oua”

Pasi

– izoleaza

– abstractizeaza

– determina

Page 14: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

14

OOP

Data denastere

datacastorie

Data de nasterea catel

Clasa cudate

Obiecte Clase de obiecte

Page 15: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

15

Metodologie OO

Exista patru etape in procesul de descompunere

– Brainstorming

– Filtrarea

– Scenarii

– Algoritmi

Page 16: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

16

Brainstorming-ul

• Este o tehnica de grup care implica contributiaspontana de idei din partea tuturor membrilordin grup

Page 17: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

17

Filtrarea

Determina care sunt clasele de baza folosite in rezolvarea problemei

Page 18: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

18

Scenarii

In aceasta etapa se atribuie responsabilitati fiecareiclase

Sunt doua tipuri de responsabilitati- determinarea informatiei despre ea insasi pecare o clasa trebuie sa o cunoasca(responsabilitati de cunoastere)- determinarea a ceea ce poate o clasa sa faca(responsabilitati comportamentale)

Incapsularea

Page 19: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

19

Algoritmii

Trebuie scrisi pentru a descrie responsablitatileobiectului:

– Responsabilitatile de cunoastere

– Responsabilitatile de actiune

Page 20: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

20

Fisele Class Responsibility Collaboration (CRC)

Page 21: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

21

Exemplu

Sa analizam procesul de rezolvarea crearii uneiliste de adrese

Brainstorming si filtrare– Incercuirea subiectelor in propozitie poate fi un

punct bun de plecare

Page 22: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

22

Examplu

Page 23: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

23

CRC Cards

Propuneti alte responsabilitati

Nume Clasa:

PersoanaSuperclasa: Subclase

Responsabilitati Colaborari

Se autoinitializeaza (nume, adresa, telefon, email

Nume, Adresa, Telefon, Email

Afiseaza Nume, Adresa, Telefon, Email

Page 24: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

24

Nume Clasa: Nume Superclasa: Subclase

Responsabilitati Colaborari

Se autoinitializeaza (nume) String

Se auto-afiseaza String

Nume Clasa:

ListaSortata(din bilioteca)

Superclasa: Subclase

Responsabilitati Colaborari

Insert (persoana) Persoana

Print Persoana

Cum difera aceasta clasa de Nume si Persoana ?

Page 25: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

25

Algoritm

Clasa Persoana

Initializare

name.initialize()Write “Introduceti numele; apasati enter."Cere si initializeaza numeleWrite “Introduceti adresa de email; apasati enter."Cere si initializeaza adresa

Afisare

name.print() Write “Numar telefon: " + telephoneNumberWrite “Adresa de e-mail: " + emailAddress

Asigura autoinitializarea nume

Asigura autoafisarea nume

Page 26: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

26

AlgoritmClasa Nume

Initializare

“Introduceti Prenumele; apasati enter."Read Prenume"Introduceti Numele; apasati enter."Read Numele

Afisare

Print “Prenumele: " + firstNamePrint “Numele: " + lastName

Page 27: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

27

Fazele pentru rezolvarea si implementareaproblemei in OO

Page 28: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

28

Functionalitati oferite de OOPIncapsularea

Clase

Mostenirea

Polimorfism

Page 29: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Incapsularea datelor si operatiilor

Programatorul poate defini accesul la atributele simetodele clasei

• Privat

• Protected

• Public

Page 30: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Incapsularea datelor si operatiilor

(“friend”)

class Node {

friend class LinkedList;

private:

itemtype key;

Node * next;

}

Page 31: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Cand se poate folosi “friend”

Link si LinkedList sau Link, LinkedList, si ListIterator

class Account {

private:

double balance, credit_limit;

public:

//other operations

void deposit(double amount);

friend void transfer (Account & target, Account & source, double amount);

}

Page 32: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Metode friendclass Node { private: int data; int key; // ...

friend int BinaryTree::find(); // numai metoda find din BinaryTree are access};

Clase friendclass Node { private: int data; int key; // ...

friend class BinaryTree; // clasa BinaryTree poate accesa acum data direct};

Page 33: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Mostenirea

Page 34: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Clase abstracteclass Shape {

protected: //data members needed if used for substitution

int X, Y;

double R1, R2;

public:

Shape (int x, y, double u, v);

virtual double area ( ) = 0;

virtual double perimeter ( ) = 0;

}

Metodele nu au implementare

Page 35: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Mostenirea din clase abstracte

class Circle : public Shape {

public:

Circle (int x, int y, double r) : X(x), Y(y), R1(r ), R2(0) {}

double area ( ) {return M_PI * R1 *R1; }

double perimeter ( ) {return 2 *M_PI * R1; }

//other methods for Circle

}

Page 36: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Utilizarea claselor abstracte

• Clasele abstracte pun la dispozitie un cadrupentru a adauga un comportament specific aplicatiei

• Utilizatorul lor trebuie sa furnizeze detalii de implementare pentru toate metdele nedefinite

Page 37: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

37

O forma ierarhica de polimorfism

toString( )equals( Object obj )getClass( )

Shapeextends

extends

Object

Circle

colorborderWidth

Color getColor( )void setBorderWidth( int m )

int computeArea( )

radius

Page 38: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Polimorfism

Abilitatea unui limbaj de a suporta metodecu nume similar intr-o structura ierarhicade clase (functie de limbaj) sau la nivel de operatori si aplicarea metodei/operatorului care este cea/cel mai potrivitpentru obiectul / zona de cod in care esteapelat/aplicat .

Page 39: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Polimorfism prin mostenire

Page 40: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

exempluclass Car

{

public virtual boolean start() = 0;

}

class VolkswagenBeetle : Car

{

public boolean start() {// implementare pt Beetle}

}

class SportsCar : Car

{

public boolean start() { implementare pentru Sport}

}

//Si utilizarea

Car cars[] = { new VolkswagenBeetle(), new SportsCar() };

for( i = 0; i < 2; i++)

Cars[i].start();

Page 41: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Imbunatatirea conceptului

Fieinterface Car

{ public boolean start(); }class VolkswagenBeetle implements Car

{ public boolean start() { //cod }}class SportsCar implements Car

{ public boolean start() { // cod }}

atunciclass Jalopy implements Car { …} // va fi polimorfica

Page 42: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Polimorfism# polimorfism sub Python

class VolkswagenBeetle(Car):

def start(): # codul pentru Volkswagen

class SportsCar(Car):

def start(): # Codul pentru SportsCar

# apelul polimorfismului

cars = [ VolkswagenBeetle(), SportsCar() ]

for car in cars:

car.start()

Page 43: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

43

O forma ierarhica de polimorfism

toString( )equals( Object obj )getClass( )

Shapeextends

extends

Object

Circle

colorborderWidth

Color getColor( )void setBorderWidth( int m )

int computeArea( )

radius

Shape

Circle

Object

Un obiect Cerc are trei parti

Page 44: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

44

Cum sunt create obiecteleCircle c = new Circle( );

Page 45: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

45

Cum sunt create obiecteleCircle c = new Circle( );

c

Shape

Circle

Object

1.

Execution Time

Page 46: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

46

Cum sunt create obiecteleCircle c = new Circle( );

c

Shape

Circle

Object

c

Shape

Circle

Object

1. 2.

Execution Time

Page 47: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

47

Cum sunt create obiecteleCircle c = new Circle( );

c

Shape

Circle

Object

c

Shape

Circle

Object

c

Shape

Circle

Object

1. 2. 3.

Execution Time

Page 48: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

48

Utilizari comune ale polimorfismului

1. In tablouri

2. Ca argument pentru metode

3. In cazul valorii (obiect) trimisainapoi de o metoda

Page 49: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

49

1) Folosirea polimorfism in tablouri

extends

toString( )equals( Object obj )getClass( )

Shape

Rectangle

extends

extends

Object

Circle Triangleextends

colorborderWidth

Color getColor( )void setBorderWidth( int m )

int computeArea( )

lengthwidth

int computeArea( )

radius baseheight

int computeArea( )

Page 50: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

50

1) Folosirea polimorfism in tablouri

[0] [1] [2]

[2]

firstShape

Attributes:length = 17width = 35

Methods:int computeArea( )

secondShape

Attributes:radius = 11

Methods:int computeArea( )

thirdShape

Attributes:base = 15height = 7

Methods:int computeArea( )

samples(an arrayof Shapeobjects)

Page 51: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

51

1) Folosirea polimorfism in tablouri

[0] [1] [2]

[2]

firstShape

Attributes:length = 17width = 35

Methods:int computeArea( )

secondShape

Attributes:radius = 11

Methods:int computeArea( )

thirdShape

Attributes:base = 15height = 7

Methods:int computeArea( )

samples(an arrayof Shapeobjects)

Page 52: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

52

2) Folosirea polimorfism ca argument al metodelor

public int calculatePaint (Shape myFigure) {

final int PRICE = 5;

int totalCost = PRICE * myFigure.computeArea( );return totalCost;

}

Page 53: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

53

2) Folosirea polimorfism ca argument al metodelor

public int calculatePaint (Shape myFigure) {

final int PRICE = 5;

int totalCost = PRICE * myFigure.computeArea( );return totalCost;

}

Page 54: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

54

2) Folosirea polimorfism ca argument al metodelor

public Shape createPicture ( ) {

/* Read in choice from user */System.out.println(“1 for rectangle, ” +“2 for circle, 3 for triangle:”);

SimpleInput sp = new SimpleInput(System.in);int i = sp.readInt( );

if ( i == 1 ) return new Rectangle(17, 35);if ( i == 2 ) return new Circle(11);if ( i == 3 ) return new Triangle(15, 7);

}

Page 55: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Generalizarea

• Se bazeaza pe obiecte container ca lists,stacks si queues

• Acestea au comportamente similareindifernet de tipul de obiect pe care ilcontin (de fapt ele jongleaza numai cu referintele catre ele)

• Prima oara apare in Template pus la dispozitie de CPP care de fapt suntimplementari ale conceptului de ADT

Page 56: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

TemplateExample

template <class T>

class Stack {

}

Notatie pentru template

private:T * buffer;

int first;

int capacity;

public:

Stack(int cap);

~Stack( );

void push(T item);

void pop( );

T top ( );

boolean empty ( );

#include Stack.cpp Se include fisierul cu implementarea

Utilizatorul trebuie sa precizezedimesiunea stivei implementateca un tablou

Page 57: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Implementare cu template

template <class T> Stack <T> :: Stack (int cap) {

buffer = new T[cap];

first = 0;

capacity = cap;

}

Tablou rezervat dinamic

Page 58: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Implementare cu templates

template <class T> void Stack<T>:::push (T item) {

if (first ==capacity) //va genera o exceptie

error (OVERFLOW);

buffer[first] = item;

first++;

}

template <class T> T Stack<T>:: top( ) {

if (first ==0) //exceptie UNDERFLOW

error (UNDERFLOW);

return buffer[first];

}

function()template <class T> return_type class_name <T> ::

Page 59: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Limitarile Template in cazul generalizarii

• Data elementele continute intr-un container sunt ordonate ele trebuie sa fie capabile sa raspunda operatorilorrelationali cum ar fi: < or ==

• Nu toate clasele au obiecte care suntcomparabile pentru ca operatoriirelationali nu au fost supraincarcati saumai rau obiectele nu pot fi comparabile(nu are sens logic operatia)

Page 60: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Supraincarcare operatori

Restrictii de utilizare

• Se pot supraincarca majoritatea operatorilor in afara de . :: ?: sizeof

• Nu se pot defini noi operatori prin“supraincarcarea ” simbolurilor care nu sunt incaoperatori

Page 61: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Supraincarcare operatori

Exemplu – Lista inlantuita

Lista

dim = 2

prim

ultim

Page 62: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Supraincarcare operatori

Lista

dim = 2

prim

ultim

Copiere superficiala folosind operatorul implicit “=“

Lista

dim = 2

prim

ultim

A

B

B = A;

B.dim = A.dim;B.prim = A.prim;B.ultim = A.ultim;

Page 63: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Supraincarcare operatori

Copiere reala:

List & List::operator = (const List & rhs) {

//daca tinta nu este goala o goleste

while (first != NULL) {

link * temp = first;

first = first -> next;

delete temp;

}

link * ptr = rhs.first;

while (ptr) {

insert ( ptr -> key); //se presupune inserarea la sfarsit lista

ptr = ptr -> next;

}

return *this;

}

Page 64: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Supraincarcare operatori

class Complex {

private:

double: re, im;

public:

Complex ( ); //constructor implicit

Complex (double x, double y);

//other member functions

Complex & operator += (const Complex & rhs);friend Complex operator + (const Complex & scr1,

const Complex & scr2);

friend ostream & operator << (ostream & out, Complex & rhs);

}

target of message is lhs

Tinta nu este un membru a clasei Complex

Page 65: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Supraincarcare operatori

Complex & Complex:: operator += (const Complex & rhs) {

re += rhs.re;

im += rhs.im;

return * this;

}

Exemplu: Complex z1(2, 3);

Complex z2 (21, -24) ;

z2 += z1;

Se creaza 2 obiecteComplex

z2 destinatia opratiei +=

Intoarce obiectul curent

Page 66: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Operator Overloading (cont.)

Complex operator + (const Complex & src1, const Complex & src2) {

Complex z;

z,re = src1.re + src2.re;

z,im = src1.im + src2.im;

return z;

}

Complex z1, z2(1, 2), z3(-2, 4);

z1 = z2 + z3;

z2 = z2 + z3;

cout << z2 + z3;

Destinatia poate fi diferita sau identicaca la operatorul original

Page 67: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Operator Overloading (cont.)

ostream & operator << (ostream & out, const Complex & rhs) {

out << ‘(‘ << rhs.re << “, “ << rhs.im << ‘)’;

return out;

}

Complex z1(1.2, -2.1), z2(24, 44);

cout << z1 << “+ “ << z2 “ = “ << z1 + z2 << endl;

Page 68: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Substitutia tipurilor la Runtime

• Cel care substituie trebuie sa fie o subclasa a tipului declarat

• Clasa originala (adica tipul referit) trebuie sa fie refererit de un pointer

• Metodele suprascrise trebuie declaratevirtuale

Page 69: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Substituire

Animal

string name, says;

int x_pos, y_pos;

Animal( ); //default

Animal(const char aname[];

//other non virtual methods

virtual void speak( );

Dog

string name, says;

int x_pos, y_pos;

Dog ( ); //default

Dog(const char aname[]);

//inherited methods

void speak( ); //override

void chase_cats(Cat & acat);

Page 70: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Substituire

Fie un tabel de pointeri catre animale

Animal * theBarn[4];

Acum se creaza niste animale si se pun in hambar

Animal MickeyMouse(“Mickey”);

Cat Sly (“Sylvester”);

Dog Fred;

Dog Spot (“Spot”);

theBarn[0] = &MickeyMouse;

theBarn[1] = &Sly;

theBarn[2] = &Fred;

theBarn[3] = &Spot;

Constructor implicit nici un nume atribuit

Page 71: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Substitutie

Acum I se spune fiecarui animal sa “vorbeasca” evident fiecare pre limba lui

for (int i = 0; i < 4; i++)

theBarn[i] -> speak( );

Page 72: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Substituirea

Ferma

Hambarul

Dog

ruff

Spot

Cat

Felix

meow

Cat

Nonamemeow

Animal

Donald

mute

Page 73: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

C# and OOP

• C# este proiectat pentru .NET Framework– Acesta este OOP

• In C#– Se poate accesa SO direct prin obiecte

– FCL (Framework class library) sunt proiectate(cica) pentru extinder si integrare in codulutilizator

Page 74: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Definirea Claselorclass Name:BaseType{

// Members}

Namespace NameName{class Name:BaseType{}

}

class MyType{public static String someTypeState;public Int32 x;public Int32 y;

}

Page 75: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Accesibilitatea• In C#, private este nivelul implicit de access

(protectie anti prost)• Optiunile de accesibilitate (scopingul)

– public – Accesibil la toti– private – Accesibil la clasa care il contine– protected – Accesibil la clasele care il contin dar si la

derivatele lor– internal – Accesibil la nivelul codului in cadrul aceluiasi

assembly– protected internal – inseamna ori protected oriinternal

• Clasele pot fi declarate ca public sau internal– Sunt private implicit– Accesibile numai codului din acelasi modul sursa

Page 76: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Tipuri Membri in C#• Fields

– Starea unui obiect sau tip

• Metode– Constructori– Functiii– Proprietati (campuri inteligente(smart))

• Membrii exista in doua forme de baza– Instanta – pentru datele obiect si metodele

• Default

– Statice – pentru tip data si metode• Use the static keyword

Page 77: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Metode

• Declarare inline cu definirea tipului

class MyType{public Int32 SomeMethod(){

return x;}

public static void StaticMethod(){// fa ceva}

}

Page 78: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Proprietati• Metodele care arata ca niste campuri (smart

fields)

class Point{Int32 x;Int32 y;public Int32 X{

get{return x;}set{x = value;}

}public Int32 Y{

get{return y;}set{y = value;}

}}

Page 79: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Constructori pentru instante

• Constructorii sunt de obicei folositi sa initializeze campurile• Constructorii pot fi descrisi “mai clar” in cazuri mai complexe

daca se foloseste this

class Point{Int32 x;Int32 y;

public Point():this(0, 0){}

public Point(Int32 x, Int32 y){this.x = x;this.y = y;

}}

Page 80: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Constructori de tip (static)

• Sunt folositi pentru initializarea campurilorstatic

• Se admite un singur constructir static per tip– Sunt apelati in Common Language Runtime

– Sunt garantati a fi apelati inainte de orice referintacatre un tip sau o instanta a acestuia

– NU accepta parametri

• Folosirea static indica tipul constructorului

Page 81: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Derivarea si obiectul

• Toate tipurile din sistem sunt derivate din Object

• Se poate totusi specifica alta clasa de baza– Fara aceasta compilatorul va asuma implicit Object

• Referintele la variabile obiect sunt folosite ca referinte generice– Clasele sunt grupate in Framework Class Library

• Objectele implementeaza metode utile de genul– ToString(), GetType()

– ReferenceEquals()

Page 82: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Polimorfism si funcntii virtuale

• O metoda este declarata virtuala cu virtual

• In clasele derivate, metodele suprascrise sunt marcate cu override

• Exemplu– ToString()metoda din Object class

– UN exemplu de clasa care o suprascrie

public virtual string ToString();

class SomeClass:Object{public override String ToString(){

return “Some String Representing State”;}

}

Page 83: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

C# si evenimentele

• C# are suport nativ pentru evenimente (suporta siparadigma cu pricina)

• Great for dealing with objects in an event-driven operating system

• Dezvoltare rapida a GUI

• Se pot inregistra diferite tipuri la un eveniment (veziobserver si generice)

• UN tip se poate inregistra la oricate evenimente

Page 84: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Gestiune de eveniment

using System;using System.Windows.Forms;class MyForm:Form{

MyForm(){Button button = new Button();button.Text = "Button";button.Click += new EventHandler(HandleClick);Controls.Add(button);

}void HandleClick(Object sender, EventArgs e){

MessageBox.Show("The Click event fired!");}public static void Main(){

Application.Run(new MyForm());}

}

Page 85: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Definirea unui eveniment• Bazata pe un mecanism standard de tratare “callback” cu delegate

class EventInt{Int32 val; public Int32 Value{

get{return val;}set{

if(Changed != null)Changed(value, val);

val = value; }

}public event Callback Changed;public delegate

void Callback(Int32 newVal, Int32 oldVal);}

Page 86: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Metodele callback (delegati)

using System;delegate void MyDelegate(String message);class App{

public static void Main(){MyDelegate call = new MyDelegate(FirstMethod);call += new MyDelegate(SecondMethod);call("Message A");call("Message B");

}static void FirstMethod(String str){

Console.WriteLine("1st method: "+str);}static void SecondMethod(String str){

Console.WriteLine("2nd method: "+str);}

}

Page 87: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Interfete

• C# suporta interfete

– Tipurile proprii pot implementa interfete

• Dupa cum era de asteptat in lipsa unui adapter suplimenta trebuieimplementat tot ce este in interfata

– Accepta definirea de interfete proprii

• Interfetele pot suporta NUMAI metode NU SI campuri

– Proprietati si evenimente incluse

– Constructorii nu sunt permisi in interfete

• Cuvantul cheie interfaceinterface Name{

// Members}

Page 88: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

Supraincarcarea operator si conversia de tip

• C# permite supraincarcarea metodelor

• Sunt apelate cand un tip propriu este folositintr-o expresie cu operatori– Poate supraincarca +, -, *, |, etc.

• Poate crea metode proprii pentru conversia de tip (cast)

• Acestia pot fi apelati implicit sau explicit

Page 89: ouape - mike.tuiasi.romike.tuiasi.ro/PP-03-OOPStudenti.pdf · C# sievenimentele •C# are suportnativpentruevenimente(suportasi paradigmacu pricina) •Great for dealing with objects

OOP design results