Exercice avancé sur l’héritage
Dans cet exercice, vous allez mettre en pratique les notions d’héritage et de surcharge de méthodes en Python. Vous devez simuler la transmission d’une donnée réseau dans le style TCP/IP. Vous avez à votre disposition un diagramme de classes UML qui modélise les différentes entités impliquées dans la transmission d’une donnée réseau. Votre objectif est de créer le code Python correspondant à ce diagramme.
Voici les principales classes et méthodes à implémenter :
- Interface : Cette classe représente une interface réseau. Elle possède deux méthodes principales,
envoyer()
etrecevoir()
, ainsi qu’une relation avec la classe Câble. Pour les besoins de cet exercice et pour des raisons de facilité, la méthoderecevoir()
sera exceptionnellement autorisée à afficher un élément dans la console. - Câble : Cette classe représente un câble reliant deux interfaces. Elle possède une méthode
connect(entrée, sortie)
pour établir la connexion entre les deux interfaces. - Donnée : Cette classe représente les données transmises sous différentes formes (PacketIP, TrameEthernet et Byte). Elle possède deux méthodes,
encapsuler(donnée)
etdécapsuler()
, qui seront surchargées par les classes filles. - PacketIP : Cette classe hérite de Donnée et représente un paquet IP. Elle surcharge les méthodes
encapsuler(donnée)
etdécapsuler()
, mais est spécialisée pour les paquets. - TrameEthernet : Cette classe hérite de Donnée et représente une trame Ethernet. Elle surcharge également les méthodes
encapsuler(donnée)
etdécapsuler()
, mais est spécialisée pour les trames. - Byte : Cette classe hérite de Donnée et représente un Byte. Elle surcharge aussi les méthodes
encapsuler(donnée)
etdécapsuler()
, mais est spécialisée pour les bytes.
Astuces d’implémentation
- Utilisez le mot-clé super() pour appeler le constructeur de la classe parente lors de l’initialisation d’une classe fille.
- Assurez-vous de bien comprendre le rôle des méthodes encapsuler et décapsuler dans chaque classe, ainsi que la manière dont elles sont surchargées. Prenez en compte les types de données passées en argument et le type de données retournées.
- Utilisez des attributs pour stocker les données et les informations relatives à chaque objet (par exemple, l’entête et le payload pour les objets de type Donnée).
- Assurez-vous de bien gérer les relations entre les objets, en particulier pour les classes Interface et Câble. Entre autres, lors de la connexion d’un câble à deux interfaces, les objets Interface et Câble doivent être mis à jour en conséquence (en modifiant les attributs
cable
,entrée
etsortie
).
Une fois le code implémenté, testez-le en créant deux interfaces, un câble et en envoyant un message d’une interface à l’autre. Le code de test ne fait que ces opérations. L’encapsulation se fait automatiquement dans les méthodes envoyer()
et recevoir()
.
Bon courage !