Enseignement > Programmation orientée objet > Java > Travaux dirigés > TD n°3 - Héritage, composition et encapsulation  

Construction de classes par héritage et composition
Encapsulation

NB : Les exemples illustrant ce TD proviennent de la logique séquentielle, mais ce n’est pas un TD d’architecture des ordinateurs !

Le but de ce TD est d’apprendre à construire des objets complexes à partir d’objets simples par héritage et/ou par composition

 

1. Portes logiques

Les portes ET-NON possèdent plusieurs entrées: e1, e2, e3, e...
La sortie est au niveau 0 si toutes les entrées sont au niveau 1
Une seule entrée au niveau 0 suffit pour que la sortie soit à 1

Les portes OU-NON possèdent plusieurs entrées: e1, e2, e3, e...
La sortie est au niveau 1 si aucune des entrées est au niveau 0
Une seule entrée au niveau 1 suffit pour que la sortie soit à 0

Examiner ces portes logiques. Elles ont en commun la caractéristique de posséder 2 entrées E1 et E2 et une sortie S. Seule la sortie S les différencie. On va donc "factoriser" ces caractéristiques dans une classe "ancêtre" PorteLogique dont hériteront 2 classe filles Nand et Nor

Définir une classe abstraite PorteLogique regroupant les caractéristiques communes de ces portes, avec un constructeur et tous les mécanismes d’encapsulation (attributs privés et méthodes permettant d'accéder aux entrées E1 et E2, plus une méthode abstraite définissant la sortie)

Ecrire les classes Nand et Nor héritant de la classe PorteLogique. Ces classe doivent simplement définir la méthode abstraite S qui est la valeur de sortie en fonction des états E1 et E2

Ecrire un programme permettant d’instancier et de tester des objets de ces classes

 

2. Circuits séquentiels

Les circuits séquentiels sont obtenus par combinaison de portes logiques, avec certaines sorties qui sont rebouclées en entrée. Contrairement aux portes logiques, l'état des sorties des circuits séquentiels dépend non seulement de l'état des entrées mais aussi de l'état antérieur des sorties : ce sont des circuits dotés de mémoire.

2.1 Les bascules R.S

Les bascules sont des bistables qui peuvent prendre deux états. Les bascules sont asynchrones. Elles possèdent deux entrées nommées S et R et deux sorties nommées Q et Q . Les sorties Q et Q sont toujours complémentaires. L'entrée S (set) met la bascule au travail et la sortie Q est au niveau 1. L'entrée R (reset) remet la bascule au repos et la sortie Q au niveau zéro.

Les bascules RS sont réalisées avec des circuits NOR. On envoie séparément et alternativement les signaux sur S et R. Si S = R = 1 il y a état indéterminé.

 est représenté par

 

TABLE DE VERITE

Etat initial Qn

S

R

Etat final Qn+1

1

1

0

1

1

0

1

0

1

1

1

?

1

0

0

1

0

1

0

1

0

0

1

0

0

0

0

0

0

1

1

?

On cherche à écrire une classe modélisant une bascule RS. Est-ce judicieux de la faire hériter de la classe PorteLogique ou d’un de ses descendants ?

Ecrire une classe modélisant une bascule RS composée de 2 circuits Nor avec tous les mécanismes d’encapsulation, à savoir :

  • Le constructeur
  • Les méthodes GetS, GetR, GetQ, GetQB pour obtenir l’état des variables correspondantes
  • Les méthodes SetS, SetR pour changer l’entrée de la bascule et calculer un nouvel état
  • une méthode pour afficher l’état de la bascule (R,S,Q,QB)

Ecrire un programme permettant d’instancier et de tester un objet de cette classe

2.2 Bascule R.S.T ou R.S.Clock

La bascule R.S.T. est une bascule pour laquelle les entrées S et R ne sont prises en compte qu'en coïncidence avec un signal de commande. Ce signal peut être fourni par une horloge, nous avons alors une bascule synchrone. Ce circuit peut être réalisé de la façon suivante.

  a pour représentation symbolique

Lorsque le signal de commande, noté ici H, est à 1 la bascule fonctionne comme indiqué précédemment et les sorties suivent les variations des entrées S et R. Par contre, lorsque le signal de commande est à 0, la bascule est bloquée : Q est indépendant des éventuels changements de S et R. L'état mémorisé correspond au dernier état avant le passage de la ligne de commande H de 1 à 0.

Ecrire une classe RST héritant de la classe RS, permettant de modéliser une bascule RST

On réécrira notamment :

  • Les méthodes SetS, SetR pour changer l’entrée de la bascule en fonction de H
  • La méthode permettant d’afficher l’état de la bascule

On ajoutera :

  • Les méthodes SetH, GetH pour encapsuler l’horloge

Ecrire un programme permettant d’instancier et de tester des objets de ces classes

2.3 Bascules J-K

La bascule J-K permet de lever l'ambiguïté que nous avons observé lorsque R = S = 1. Ceci peut être obtenu en asservissant les entrées R et S aux sorties selon le schéma logique suivant :

 est représenté par

Ce qui nous permet de construire la table de vérité de la bascule J-K :

 

Jn

Kn

Qn

 Qn

S

R

Qn+1

0

0

0

1

0

0

0

0

0

1

0

0

0

1

0

1

0

1

0

0

0

0

1

1

0

0

1

0

1

0

0

1

1

0

1

1

0

1

0

0

0

1

1

1

0

1

1

0

1

1

1

1

0

0

1

0

 

 

Nous constatons que nous ne rencontrons jamais la combinaison R = S = 1. Cette table peut se résumer sous la forme suivante :

 

Jn

Kn

Qn+1

0

0

Qn

0

1

0

1

0

1

1

1

Qn

 

Ecrire une classe JK, modélisant une bascule JK par composition à partir d'une bascule RST

Ecrire un programme permettant d’instancier et de tester des objets de ces classes