IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ALM Discussion :

LSP - Hériter Rectangle d'un Square


Sujet :

ALM

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut LSP - Hériter Rectangle d'un Square
    Bonjour,

    dans http://www.objectmentor.com/resources/articles/lsp.pdf à propos du LSP, l'exemple est donné à base d'un Square héritant d'un Rectangle.

    Auriez-vous une idée d'exemple qui poserait problème pour le cas d'un Rectangle héritant d'un Square ?

    Cordialement.

    [EDIT : Il semble que je ne sois pas dans la bonne section. Peut être faudrait-il déplacer mes post dans Algorithme ?]

  2. #2
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    Voici l'argument mis en avant dans l'article (en C++)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #include <iostream>
    
    using namespace std;
    
    class Rectangle
    {
    public:
      Rectangle( int w = 0, int h = 0 ) : width_(w), height_(h) {}
      
      virtual int width() const { return width_; }
      virtual int height() const { return height_; }
    
      virtual void width( int w ) { width_ = w; }
      virtual void height( int h ) { height_ = h; }
      
    private:
      int width_;
      int height_;
    };
    
    class Square : public Rectangle
    {
    public:
      Square( int w = 0 )
      {
        width( w ); 
      }
    
      virtual void width( int w ) { Rectangle::width( w ); Rectangle::height( w );}
      virtual void height( int h ) {  Rectangle::width( h ); Rectangle::height( h ); }  
    };
    
    void g( Rectangle& r )
    {
      r.width( 5 );
      r.height( 4 );
      
      assert( r.width() * r.height() == 20 );
    }
    
    int main()
    {
      Rectangle r( 2, 3 );
      g( r );
    
      Square s( 4 );
      g( s );
    }

    Est-ce que celui là pour l'autre sens serait recevable ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #include <iostream>
    
    using namespace std;
    
    class Square
    {
    public:
      Square( int w = 0 ) { width( w ); }
      
      int width() const { return width_; }
      void width( int w ) { width_ = w; }
      
      virtual double area() const { return width() * width(); }
      
    private:
      int width_;
    };
    
    class Rectangle : public Square
    {
    public:
      Rectangle( int w = 0, int h = 0 )
      {
        width( w ); 
        height( h );
      }
    
      int height() const { return height_; }
      void height( int h ) {  height_ = h; }
    
      virtual double area() const { return width() * height(); }
    
    private:
      int height_;
    };
    
    void g( Square& r )
    {
      r.width( 5 );
      
      assert( r.area() == 25 );
    }
    
    int main()
    {
      Square s( 4 );
      g( s );
    
      Rectangle r( 2, 3 );
      g( r );
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    255
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 255
    Par défaut
    Il me semble plus logique qu'un carré hérite d'un rectangle, ce serait géométriquement plus juste... non ?

  4. #4
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    Malheureusement, je ne suis pas sûr que "géométriquement juste" soit un argument pour la modélisation dans mon cas.
    L'article en question montre d'ailleurs que non.

    J'ai cru comprendre que c'est un sujet délicat, ou tout le monde ne semble pas d'accord. En tout cas, l'essentiel est qu'une hiérarchie de classes répond à un besoin, et cette hiérarchie n'est valide que selon l'usage qu'on en fait. sa validité dépend du contexte.

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Géométriquement, un carré est un rectangle particulier donc un carré hérite d'un rectangle, pas l'inverse !

    À moins que vous ne vouliez remettre en question 3000 ans de géométrie ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Il y a déjà un long sujet à ce sujet sur le forum : Héritage classes carré/rectangle.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/12/2011, 19h37
  2. [MFC]Ecrire du texte dans un rectangle
    Par zaz16 dans le forum MFC
    Réponses: 8
    Dernier message: 29/07/2003, 10h31
  3. Comment centrer un Texte dans un rectangle ...
    Par Djedjeridoo dans le forum Composants VCL
    Réponses: 3
    Dernier message: 16/06/2003, 21h56
  4. Dessiner un rectangle avec bords et texte ...
    Par Djedjeridoo dans le forum Composants VCL
    Réponses: 3
    Dernier message: 16/06/2003, 17h17
  5. Réponses: 9
    Dernier message: 11/03/2003, 12h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo