Object-Oriented Design & Patterns

Cay S. Horstmann

Chapitre 6

Héritage et classes abstraites

Matière du chapitre

Représenter la spécialisation

Représenter la spécialisation

Représenter la spécialisation

.

Méthodes et attributs de Manager

La terminologie Super/Sous

La terminologie Super/Sous


.

Hiérarchies d'héritage

Hiérarchies d'héritage

.

Principe de substitution

Invoquer les méthodes d'une superclasse

Invoquer les méthodes d'une superclasse

Invoquer le construction d'une superclasse

Pré-conditions

Post-conditions, visibilité, exceptions

Programmation graphique avec l'héritage

Observateurs de souris (« Mouse Listeners »)

Adaptateurs de souris « Mouse Adapters  »

Programme déplaçant une voiture

Programme déplaçant une voiture

.

Rédacteur de scène

Rédacteur de scène



Le type interface SceneShape

Type interface SceneShape

.

Type interface SceneShape

public interface SceneShape
{
   void setSelected(boolean b);
   boolean isSelected();
   void draw(Graphics2D g2);
   void drawSelection(Graphics2D g2);
   void translate(int dx, int dy);
   boolean contains(Point2D aPoint);
}

Classes CarShape et HouseShape

public class CarShape implements SceneShape 
{
...
public void setSelected(boolean b) { selected = b; }
public boolean isSelected() { return selected; }
private boolean selected;
}

public class HouseShape implements SceneShape
{
...
public void setSelected(boolean b) { selected = b; }
public boolean isSelected() { return selected; }
private boolean selected;
}

Classes abstraites

public class SelectableShape implements Item 
{
public void setSelected(boolean b) { selected = b; }
public boolean isSelected() { return selected; }
private boolean selected;
}

Classes abstraites

.

Classes abstraites

Classes abstraites et type interface

Rédacteur de scène

Technique de surbrillance uniforme

Technique de surbrillance uniforme



Méthode modèle

Patron TEMPLATE METHOD

Contexte

  1. Un algorithme est applicable pour plusieurs types.
  2. L'algorithme peut être divisé en plusieurs opérations primitives. Les opérations primitives peuvent être différentes pour chaque type
  3. L'ordre des opérations primitives ne dépend pas du type

Patron TEMPLATE METHOD

Solution

  1. Définir une superclasse qui a une méthode pour l'algorithme et des méthodes abstraites pour les opérations primitives.
  2. Implémenter l'algorithme en appelant les opérations primitives dans l'ordre approprié.
  3. Ne pas définir les opérations primitives dans la superclasse ou bien, les définir pour avoir un comportement par défaut approprié.
  4. Chaque sous classe définit les opérations primitives mais pas l'algorithme.

Patron TEMPLATE METHOD

.

Patron TEMPLATE METHOD

Nom dans le patron de conception Vrai nom (Selectable shapes)
AbstractClass
SelectableShape
ConcreteClass
CarShape, HouseShape
templateMethod()
drawSelection
primitiveOp1(), primitiveOp2()
translate, draw

Formes composées

Formes composées

.

Accès aux éléments d'une superclasse

Accès protégé

Hiérarchie des composants de Swing

Hiérarchie des composants de Swing

.

Hiérarchie des composants de Swing

L'aspect et la convivialité (« look and feel »)



Hiérarchie des composants de Swing

Hiérarchie des formes géométriques

Hiérarchie des formes géométriques

.

Formes rectangulaires

Classes Float/Double

Classes Float/Double

.

Classes Float/Double

public class Rectangle2D 
{
public static class Float extends Rectangle2D
{
public double getX() { return x; }
public double getY() { return y; }
public double getWidth() { return width; }
public double getHeight() { return height;}
public void setRect(float x, float y, float w, float h)
{
this.x = x; this.y = y;
this.width = w; this.height = h;
}
public void setRect(double x, double y,
double w, double h)
{
this.x = (float)x; this.y = (float)y;
this.width = (float)w; this.height = (float)h;
}
...
public float x;
public float y;
public float width;
public float height;
}
. . .

Classes Float/Double

   . . .
public static class Double extends Rectangle2D
public double getX() { return x; }
public double getY() { return y; }
public double getWidth() { return width; }
public double getHeight() { return height;}
public void setRect(double x, double y,
double w, double h)
{
this.x = x; this.y = y;
this.width = w; this.height = h;
}
...
public double x;
public double y;
public double width;
public double height;
}
...
}

Float/Double Classes

Le pattern TEMPLATE METHOD

Nom dans le patron de conception
Vrai nom (Rectangles)
AbstractClass
Rectangle
ConcreteClass
Rectangle2D.Double
templateMethod()
contains
primitiveOpn()
getX, getY, getWidth, getHeight

Hiérarchie des classes d'exception

Hiérarchie des classes d'exception

.

Traiter les exceptions

Définir des classes d'exception

Quand ne pas utiliser l'héritage

public class Point 
{
public Point(int anX, int aY) { ... }
public void translate(int dx, int dy) { ... }
private int x;
private int y;
}

public class Circle extends Point // DON'T
{
public Circle(Point center, int radius) { ... }
public void draw(Graphics g) { ... }
private int radius;
}

Quand ne pas utiliser l'héritage

Quand ne pas utiliser l'héritage

Quand ne pas utiliser l'héritage