Témoignage
 

Rubrique « Info »

 



Écrivez à AILES !



Retour vers programmation



Retour vers les questions Objet



Retour vers les questions sur le
Type, Classe, Objet
 


Questionnaire Objet
Type, Classe, Objet 

[AnnotedC++], [OOM-PP], [schupp], [vassar]


Ok... 
Il ne s'agit pas à proprement parler d'une question "super-tordue-de-la-mort-qui-tue".
Il s'agit plutôt, en une page, de rappeler les bases, mais aux travers de questions parfois inhabituelles.

Pour résumer :

  • Un type représente une "caractéristique" (issue d'un travail d'abstraction qui est introduit dans l'article sur les types)

  • Une classe est une collection d'objets ayant en commun :
    - des responsabilités (en anglais "features" ou "responsability", à savoir :
            * les attributs qui représentent la "responsabilité" de savoir quelque chose 
            * les méthodes qui représente la "responsabilité" de faire quelque chose).
        (on verra plus bas que attributs et méthodes sont  des "types dérivés", donc une classe
         peut être vue comme une collection d'objet partageant des caractéristiques communes)
    - des invariants (qui définissent :
            * comment les éléments sont reliés entre eux, par exemple au travers de règles de visibilité - public, protected, private -, 
            * les conditions de viabilité des objets)
    Une classe implémente un type (cf. type d'objet pour bien comprendre). 
    (dixit [OOM-PP])

  • Un objet est un concept autonome et actif identifié comme un élément physique "réel" ou un concept abstrait.
    Un objet instancie une classe, mais peut lui-même être une classe (auquel cas sa classe sera une "méta-classe").
    Or une classe est un "type dérivé", donc un objet peut être un "type dérivé"...
    Dans tous les cas, un objet est fondamentalement une notion dynamique
    Un objet est un acteur d'un scénario d'échange de messages : il envoie et reçoit des messages et change son état local.
    Un objet possède donc :
    ([vassar])
    - une structure ;
    - un état ;
    - un ensemble d'
    opérations lui permettant de générer des messages ;
    - un identifiant lui permettant de distinguer d'autres objets de même classe et de même état.
    (Typiquement, un objet se distingue d'un autre par son adresse mémoire, par exemple).

    Pour bien comprendre la différence entre objet (point de vue dynamique) et classe (point de vue statique), on peut préciser les notions de :  ([schupp])

  • message (dynamique) : requête envoyée d'un objet à un autre via une opération. Chaque message à un destinataire identifié. L'expéditeur attend du destinataire qu'il traite le sa requête. La façon dont le message est interprété dépend des méthodes supportées par le destinataire. L'expéditeur ne connaît pas les actions précises faites par le destinataire, du fait du masquage d'information. La requête sera exécutée par une méthode publique qui pourra utiliser en interne une ou plusieurs méthodes privées...

  • méthode (statique) : spécification des opérations faites par un objet lors de la réception d'un message. Il doit y avoir une correspondance 1-1 entre un message donné et une méthode exécutée pour un objet d'une classe donnée.
    Mais des objets de différentes classes peuvent exécuter des méthodes différentes pour un même message : c'est le cas dans le polymorphisme, où un même message arrive à des méthodes de signature identique mais au contenu très différent.

  • opération (dynamique) : implémentation d'une méthode, afin de pouvoir générer un message. La boucle est bouclée ;)

Les Types : leurs principales catégories sont énumérées ci-dessous mais sont détaillées dans le questionnaire Langage de Programmation, plus précisément dans les réponses aux questions sur les types.

On distingue 2 sortes de "types" (ou caractéristique) (d'après [AnnotedC++]):

  • les types de base (anglais : "fundamental type") : Cf. types de base.

  • les types dérivés, qui se construisent d'une façon ou d'une autre à partir des type de base. cf. types dérivés.

Pour être plus précis, [schupp] rappelle dans son cours "Data Type" les 5 catégories de type : Cf. 5 types.

Qu'est-ce que le type d'un objet ?

    Souvenons-nous qu'un objet est aussi bien instance que classe.... que type ! Alors parler du "type d'un objet", cela peut donner mal à la tête. Cela fait avant tout référence à sa structure (évoquée ci-dessus lors de la définition d'un objet).
    On peut parler de l'objet "Voiture" (instance de la classe "Classe" ou, en UML1.4, de la classe "Classifier"), comme de l'objet "BMW" (instance de la classe "Voiture").
    Dans tous les cas, le type d'un objet représente la spécification de sa classe, du point de vue de l'intention de la classe (quelles sont les caractéristiques que la classe est censée représenter ?), et non de l'extension de la classe (quelle est la liste exhaustive, "l'implémentation" précise des caractéristiques de cette classe ?)
    Ainsi, le type de l'objet "Voiture" est un type dérivé composé de responsabilités (attributs et  méthodes) qui représentent ce que la classe est censée savoir ou faire.
    Par exemple, le type de l'objet "Voiture" est censé avoir une vitesse et pouvoir rouler.
    La classe "Voiture" qui implémente le type d'objet "Voiture" peut le faire de mille façons différentes, rien que pour représenter la vitesse : via un attribut vitesse ou une méthode getVitesse() qui calcule la vitesse en fonction de la vitesse de rotation des roues et de leur diamètre! Le fait de "savoir rouler" peut se traduire, s'implémenter par des méthodes aussi diverses que "démarrer", "embrayer", "freiner", ... toutes contribuant à implémenter les responsabilités de savoir-faire définies par le type de l'objet "Voiture". 
   Le "type d'un objet" est donc plus un concept qu'une "réalité" manipulée quotidiennement par les programmateur en langage objet. Ceux-ci connaissent se servent d'abord du type dérivé pour définir le "type d'une classe" (cf. paragraphe suivant)
   Donc, le plus souvent, parler du type de l'objet est un abus de langage pour désigner le type de la classe qui instancie l'objet !!!


Qu'est-ce que le type d'une classe ?
    C'est plus simple que le "concept" de type d'objet : c'est l'interface publique de la classe (composée de méthodes, mais aussi d'attributs, bref, de "caractéristiques" qui  résulte d'un travail d'abstraction). De toute classe on peut en déduire un type, et cela joue un rôle dans l'héritage de Type, une des 2 sortes d'héritages utilisées en langage objet.

Différence entre type et interface ?
    En relisant l'article sur le polymorphisme, on a vu que, par
binding de valeur, on accède au polymorphisme dynamique d'inclusion
   Le type d'un objet (abus de langage pour désigner le type de la classe instanciant l'objet) est la plus grande interface possible, celle présentant à l'utilisateur toutes les fonctions de la classe instanciant l'objet... pour peu que l'on mette cet objet dans une variable de même type (le fameux
binding de valeur évoqué ci-avant).
Ainsi :
Base {
  void m();
}
Derived : public Base {
  void m2();
}
Base    aBase    = new Derived();
Derived aDerived = new Derived();

    Dans les 2 cas, le type de l'objet "new Derived()" est Derived... mais le "type de la variable" aBase agit comme une interface qui filtre les fonctionnalités de "new Derived" pour ne laisser que celles de la classe Base.
    Lorsque ce filtre offre toute les fonctionnalités de l'objet (ce qui est le cas de la variable aDerived), type de l'objet et interface sont confondus.
    Donc, un objet n'a qu'un type, mais, au travers des variables auxquelles l'objet sera assigné, plusieurs interfaces possibles, que sont ses types parents.

Et l'interface en java, alors ?
    "interface", en java, est un type sans aucune implémentation ni attribut. Du coup, lors d'héritage multiple, on évite tout problème d'implémentation multiple...
    Et alors ?
2 classes liées par des types commun vont partager une implémentation commune.
Mais 2 classes liées par une interface java commune pourront très bien n'avoir aucune implémentation commune ! Le
polymorphisme dynamique d'inclusion qui consiste à appeler la bonne implémentation pour une méthode donnée fonctionnera alors que ces méthodes ne surchargent aucune implémentation parente.



               
 
Avertissement !
 
Décollage !  |  Présentation du site web "AILES"  | 
Infos générales  |  articles "Informatique"