Exercices et compléments
Exercices
Exo 1
- On souhaite modéliser un collection de consoles et jeux rétro en utilisant les techniques de programmation orientée objet.
- Définir les classes
VideoGame
etVideoGameConsole
. - Chaque classe propose les propriétés:
name
,releaseYear
. VideoGame
contient en plus une liste des consoles compatibles (pour les jeux cross-platform) via la propriété:platforms
.VideoGameConsole
contient en plus la propriété:companyName
de type string.- (⚠ à ne pas faire en Python) Définir toutes les propriétés en
readonly
dans le constructeur.- Quel est intérêt du qualificateur
readonly
? - En TypeScript, est-ce que les propriétés sont publiques ou privées par défaut ? Est-ce le cas pour tous les langages ?
- Quel est intérêt du qualificateur
- Définir les classes
- On suppose que le collectionneur a une seule console du même modèle. C'est à dire qu'on peut avoir une instance statique (ou unique, ou globale) pour chaque console.
- Créer une ServiceLocator qui permet de récupérer une instance unique de ces consoles avec les
name
etcompanyName
:DegaDrive
,Dega
.Satourne
,Dega
.Super Nontendo
,Nontendo
.Nontendo
,Nontendo
.- Le choix du
releaseYear
est libre.
- Créer une ServiceLocator qui permet de récupérer une instance unique de ces consoles avec les
- Créer une factory
createDegaDriveVideoGame
pour créer des jeux dont laplatform
est "DegaDrive". Faire la même chose pour "Super Nontendo" - Créer une factory
createCrossPlatformVideoGame
pour créer des jeux dont les plateformes sontDegaDrive
,Satourne
,Super Nontendo
,Nontendo
. - Créer une liste
retroGames
qui contient 1 jeu pour "DegaDrive", un jeu pour "Super Nontendo" et un jeu cross-platform. Le choix duname
,releaseYear
est libre pour chaque jeu.
Solution
`ts class VideoGame { constructor( readonly name: string, readonly releaseYear: number, readonly platforms: readonly VideoGameConsole[] ) {}
toString() { return JSON.stringify(this, null, 4); } }
class VideoGameConsole { constructor( readonly name: string, readonly releaseYear: number, readonly companyName: string ) {}
toString() { return JSON.stringify(this, null, 4); } }
class VideoGameServiceLocator { readonly degaDrive = new VideoGameConsole("DegaDrive", 1920, "Dega"); readonly satourne = new VideoGameConsole("Satourne", 1950, "Dega"); readonly nontendo = new VideoGameConsole("Nontendo", 1900, "Nontendo"); readonly superNontendo = new VideoGameConsole( "Super Nontendo", 1930, "Nontendo" );
private constructor() {}
private static readonly _instance = new VideoGameServiceLocator();
static get instance(): VideoGameServiceLocator { return this._instance; } }
function createDegaDriveVideoGame( name: string, releaseYear: number ): VideoGame { return new VideoGame(name, releaseYear, [ VideoGameServiceLocator.instance.degaDrive, ]); }
function createSuperNontendoVideoGame( name: string, releaseYear: number ): VideoGame { return new VideoGame(name, releaseYear, [ VideoGameServiceLocator.instance.superNontendo, ]); }
function createCrossPlatformVideoGame( name: string, releaseYear: number ): VideoGame { return new VideoGame(name, releaseYear, [ VideoGameServiceLocator.instance.degaDrive, VideoGameServiceLocator.instance.satourne, VideoGameServiceLocator.instance.superNontendo, VideoGameServiceLocator.instance.nontendo, ]); }
const retroGames = [ createDegaDriveVideoGame("Super hydlike", 1931), createSuperNontendoVideoGame("Final Fiction", 1940), createCrossPlatformVideoGame("International Football", 1920), ];
console.table(retroGames);
console.log(retroGames.toString()); `
Exo 2
- Créez une classe
Point
qui possède deux propriétés x et y de typenumber
correspondant aux coordonnées du point. - Ajoutez une méthode print() qui affiche les coordonnées du point de cette façon (ici, x = 2 et y = 3):
Point | x : 2 | y : 3
- Ajoutez une méthode
translate(tx,ty)
qui ajoutetx
àx
etty
ày
.
Exo 3
- Créez une classe
BankAccount
modélisant un compte en banque. - La classe possède deux propriétés initialisées dans le constructeur.
balance
correspond au solde du comptemanagementCost
qui correspond au frais de gestion du compte.
- Ajoutez une méthode
print()
qui affiche les information du compte de cette façon:Compte ( solde: 1000€ | frais de gestion: 13€ )
- Ajoutez une méthode
debit(amount: number)
qui enlèveamount
au solde du compte uniquement si le solde est suffisant. Elle retourne un booléen qui renvoietrue
si le débit a réussi, sinonfalse
. - Ajouter une méthode
send(bankAccount: BankAccount, amount: number)
qui transfère de l'argent vers un autre compte uniquement si le solde est suffisant. La méthode retourne un booléen calculé de la même façon que la méthodedebit
.