[MUSIQUE] [MUSIQUE] Nous allons voir maintenant que nous pouvons construire des objets à partir d'autres objets. Il y a deux façons de procéder. La première façon, c'est que des objets contiennent d'autres objets, des objets d'une autre classe. Comment vont-ils contenir ces objets? Tout simplement des attributs de la classe vont être des objets d'une autre classe. Pour vous donner un exemple, on imagine une classe voiture. Une voiture contient une carrosserie, [BRUIT] un moteur, des roues. On va pouvoir construire une classe voiture qui aura comme attributs : une classe qui sera un objet de la classe carrosserie, un autre attribut qui sera un objet de la classe moteur, et ici quatre objets si c'est une voiture traditionnelle, quatre objets de la classe roues. La classe roues elle-même, elle va pouvoir se construire à partir de plusieurs types d'objets. Une roue est composée d'un pneu et d'une jante. On pourra donc facilement définir une roue comme étant un objet qui contient deux attributs : un attribut de la classe pneu, et un attribut de la classe jante. Et vous voyez que de cette façon-là , on va pouvoir progressivement construire des informations, des structures d'informations qui vont être de plus en plus complexes, en les agrégeant les unes aux autres. Cette approche de construction d'objets qui contiennent d'autres objets, comment est-ce qu'elle va se concrétiser, comment elle va se réaliser en Scala? Tout simplement, je vais à un moment décrire ma classe pneu, je vais décrire ma classe jante, pour la classe roue. Je vais décrire une variable pneu qui va tout simplement être l'instanciation d'un objet de la classe pneu. Idem pour la jante qui sera une instanciation de la classe jante. Cette approche permet d'assembler, de combiner ensemble et de construire des structures d'informations de plus en plus complexes, simplement en intégrant comme attributs d'un objet des objets d'une autre classe. L'autre approche pour construire des objets à partir d'autres objets, ça va être la notion d'héritage. La notion d'héritage va permettre de faire dériver un objet d'un autre objet, ou plus exactement d'une autre classe. On va prendre là aussi un exemple. On imagine une classe personne qui permet de décrire une personne de façon générale, à partir de son nom, son prénom, son âge, pourquoi pas son adresse. Et pour représenter des catégories de personnes particulières, par exemple dans une entreprise, on va avoir des personnes qui vont être dans l'entreprise des employés, et on va avoir d'autres personnes qui, elles, vont être des clients. Qu'ils soient employés ou qu'ils soient clients, ils ont tous un nom et un prénom, donc ils font tous partie de la classe personne. Mais par contre, chaque employé va avoir des caractéristiques que toutes les personnes normales n'ont pas. Tous les clients vont avoir des caractéristiques que toutes les personnes normales n'ont pas. Et les employés vont avoir des caractéristiques supplémentaires qui ne sont pas les mêmes que les caractéristiques supplémentaires que les clients vont avoir. On va donc pouvoir construire les classes employé et les classes client à partir de la classe personne, en dérivant la classe employé de la classe personne. À partir de ce moment-là , tout ce qui aura été décrit dans la classe personne fera automatiquement partie de la classe employé. Il suffira simplement d'y ajouter les éléments supplémentaires. Idem pour la classe client : tous les objets de la classe client posséderont toutes les caractéristiques, tous les attributs et toutes les méthodes de la classe personne, et à ce moment-là , on aura simplement à indiquer, à décrire les attributs supplémentaires et les méthodes supplémentaires. Et donc chaque employé pourra être à la fois considéré comme un objet de la classe employé, mais aussi comme un objet de la classe personne. Idem pour le client, il pourra être considéré comme un objet de la classe personne ou comme un objet de la classe client. Comment met-on ce mécanisme en œuvre en Scala? Là aussi, ça se fait au moment de la déclaration de la classe. [BRUIT] Quand on construit ce qu'on appelle la classe fille, ici, les classes filles ce seront les classes employé et les classes client. La classe mère, ce sera la classe personne. Et donc, on dit que les classes filles héritent de la classe mère. L'héritage se résume sous la forme de l'ensemble des attributs et des méthodes de la classe mère. Au moment de la déclaration, quand on va décrire la classe fille, à la suite des paramètres on va simplement rajouter la clause, l'instruction extends, pour indiquer que la classe fille étend, suivie du nom de la classe mère et des paramètres nécessaires pour réaliser la construction d'un objet de la classe mère. Cette déclaration ici indique d'une part que la classe fille étend la classe mère, et que les objets de la classe fille sont construits comme étant dans un premier temps des instances de la classe mère, auxquelles on va rajouter tous les attributs et toutes les méthodes qu'on va décrire dans le bloc d'instructions qui va être attaché à la classe fille. Nous venons de voir les deux approches, les deux façons qui permettent de construire des objets à partir d'autres objets ; soit des objets qui contiennent des objets, soit des objets qui héritent d'autres objets. [MUSIQUE] [MUSIQUE]