paradigmas de linguagens de programacao - aula #7

20
Paradigmas de Linguagens de Programação Paradigma Orientado a Objetos Aula #7 (CopyLeft)2009 - Ismar Frango [email protected]

Upload: ismarfrango

Post on 25-May-2015

1.051 views

Category:

Education


4 download

DESCRIPTION

Paradigmas de Linguagens de Programacao Aula #7 Prof. Ismar Frango

TRANSCRIPT

Page 1: Paradigmas de Linguagens de Programacao - Aula #7

Paradigmas de Linguagens de Programação

Paradigma Orientado a ObjetosAula #7

(CopyLeft)2009 - Ismar Frango [email protected]

Page 2: Paradigmas de Linguagens de Programacao - Aula #7

“There are only two kinds of languages: the ones people complain about and the ones nobody uses.”

Bjarne Stroustrup

Binding em LOO

Page 3: Paradigmas de Linguagens de Programacao - Aula #7
Page 4: Paradigmas de Linguagens de Programacao - Aula #7
Page 5: Paradigmas de Linguagens de Programacao - Aula #7

12/04/23

Page 6: Paradigmas de Linguagens de Programacao - Aula #7
Page 7: Paradigmas de Linguagens de Programacao - Aula #7

invariância

covariância

contravariância

Page 8: Paradigmas de Linguagens de Programacao - Aula #7
Page 9: Paradigmas de Linguagens de Programacao - Aula #7
Page 10: Paradigmas de Linguagens de Programacao - Aula #7

12/04/23

?

Page 11: Paradigmas de Linguagens de Programacao - Aula #7

?

Page 12: Paradigmas de Linguagens de Programacao - Aula #7

Asteroid SpaceShip

Thing

Dispatching em LOO

Page 13: Paradigmas de Linguagens de Programacao - Aula #7

abstract class Thing {public abstract void collideWith(Thing other); } class Asteroid extends Thing { public void collideWith(Thing other) { if (other instanceof Asteroid) { // handle Asteroid-Asteroid collision } else if (other instanceof Spaceship) { // handle Asteroid-Spaceship collision } } } class Spaceship extends Thing { public void collideWith(Thing other) { if (other instanceof Asteroid) { // handle Spaceship-Asteroid collision } else if (other instanceof Spaceship) { // handle Spaceship-Spaceship collision } } }

Page 14: Paradigmas de Linguagens de Programacao - Aula #7

abstract class Thing { public abstract void collideWith(Thing other); } class Asteroid extends Thing { public void collideWith(Asteroid other) { System.out.println("handle Asteroid-Asteroid collision"); } public void collideWith(Spaceship s) { System.out.println("handle Asteroid-Spaceship collision"); }} class Spaceship extends Thing { public void collideWith(Asteroid a) { System.out.println("handle Spaceship-Asteroid collision"); } public void collideWith(Spaceship other) { System.out.println("handle Spaceship-Spaceship collision"); }

}

Page 15: Paradigmas de Linguagens de Programacao - Aula #7

abstract class Thing { public abstract void collideWith(Thing other); } class Asteroid extends Thing { public void collideWith(Thing other) {} public void collideWith(Asteroid other) { System.out.println("handle Asteroid-Asteroid collision"); } public void collideWith(Spaceship s) { System.out.println("handle Asteroid-Spaceship collision"); }} class Spaceship extends Thing { public void collideWith(Thing other) {} public void collideWith(Asteroid a) { System.out.println("handle Spaceship-Asteroid collision"); } public void collideWith(Spaceship other) { System.out.println("handle Spaceship-Spaceship collision"); }

}

Page 16: Paradigmas de Linguagens de Programacao - Aula #7

Asteroid

ExplodingAsteroid

SpaceShip

GiantSpaceShip

Thing

Page 17: Paradigmas de Linguagens de Programacao - Aula #7

class SpaceShip {};class GiantSpaceShip : public SpaceShip {}; class Asteroid {public: virtual void CollideWith(SpaceShip&) { cout << "Asteroid hit a SpaceShip" << endl; } virtual void CollideWith(GiantSpaceShip&) { cout << "Asteroid hit a GiantSpaceShip" << endl; }}; class ExplodingAsteroid : public Asteroid {public: virtual void CollideWith(SpaceShip&) { cout << "ExplodingAsteroid hit a SpaceShip" << endl; } virtual void CollideWith(GiantSpaceShip&) { cout << "ExplodingAsteroid hit a GiantSpaceShip" << endl; }};

Page 18: Paradigmas de Linguagens de Programacao - Aula #7

class SpaceShip {};class GiantSpaceShip : public SpaceShip {}; class Asteroid {public: virtual void CollideWith(SpaceShip&) { cout << "Asteroid hit a SpaceShip" << endl; } virtual void CollideWith(GiantSpaceShip&) { cout << "Asteroid hit a GiantSpaceShip" << endl; }}; class ExplodingAsteroid : public Asteroid {public: virtual void CollideWith(SpaceShip&) { cout << "ExplodingAsteroid hit a SpaceShip" << endl; } virtual void CollideWith(GiantSpaceShip&) { cout << "ExplodingAsteroid hit a GiantSpaceShip" << endl; }};

Asteroid theAsteroid; SpaceShip theSpaceShip; GiantSpaceShip theGiantSpaceShip;theAsteroid.CollideWith(theSpaceShip); theAsteroid.CollideWith(theGiantSpaceShip);

Asteroid* theAsteroidReference = new ExplodingAsteroid(); theAsteroidReference->CollideWith(theSpaceShip); theAsteroidReference->CollideWith(theGiantSpaceShip);

SpaceShip& theSpaceShipReference = theGiantSpaceShip; theAsteroid.CollideWith(theSpaceShipReference); theAsteroidReference->CollideWith(theSpaceShipReference);

Page 19: Paradigmas de Linguagens de Programacao - Aula #7

class SpaceShip {virtual void CollideWith(Asteroid& inAsteroid) { inAsteroid.CollideWith(*this); } };class GiantSpaceShip : public SpaceShip {};

Asteroid hit a SpaceShipExplodingAsteroid hit a SpaceShip

SpaceShip& theSpaceShipReference = theGiantSpaceShip; Asteroid& theAsteroidReference = theExplodingAsteroid; theSpaceShipReference.CollideWith(theAsteroid); theSpaceShipReference.CollideWith(theAsteroidReference);

class SpaceShip {virtual void CollideWith(Asteroid& inAsteroid) { inAsteroid.CollideWith(*this); } };class GiantSpaceShip : public SpaceShip {virtual void CollideWith(Asteroid& inAsteroid) { inAsteroid.CollideWith(*this); } };

Asteroid hit a GiantSpaceShipExplodingAsteroid hit a GiantSpaceShip

Page 20: Paradigmas de Linguagens de Programacao - Aula #7

O Padrão Visitor