Il est courant de réutiliser du code dans la programmation orientée objet. Les classes existent pour que vous puissiez créer des objets sans avoir à écrire les mêmes variables et fonctions encore et encore.
Mais qu'en est-il des cours eux-mêmes ? Parfois, les classes sont également très similaires. Par exemple, un arbre a des branches, des racines et un tronc. Cela s'applique aux ormes, aux chênes et aux pins ponderosa.
Si vous ajoutiez un arbre à un jeu, vous pourriez créer des parties d'arbre pour des dizaines d'arbres. Mais il serait plus facile de créer une classe d'arbre et que tous les autres arbres héritent de ses propriétés.
Il existe un concept dans la programmation orientée objet appelé "garder au SEC". DRY signifie "Ne vous répétez pas". Si vous vous retrouvez à copier et coller beaucoup de code, vous introduisez également de la place pour beaucoup d'erreurs.
Disons que vous écrivez le code d'un nouveau jeu Tamagotchi. Le premier animal de compagnie virtuel sera un ours polaire. Vous créez donc une classe appelée PolarBear en JavaScript/TypeScript.
classe PolarBear {
poids_privé :nombre =990 ;
constructeur(poids :nombre =0) {
this._weight =poids
}
faire du bruit() {
console.log("a fait un rugissement");
}
manger() {
console.log("mange ce qu'il veut");
}
sommeil() {
console.log("j'ai bien dormi");
}
errer() {
console.log("errait sans but");
}
}
Ensuite, votre patron vous dit que la haute direction a fait une énorme percée. Ils ont réalisé que ce n'était plus les années 90 et qu'ils pouvaient installer plus de 5K de mémoire dans le Tamagotchi. Et maintenant, ils veulent tous les ours.
Vous retroussez vos manches et vous remettez au travail, en créant des copies de la classe ours. Ensuite, votre patron frappe à nouveau à votre porte. Il s'avère qu'ils veulent que le jeu soit plus éducatif. Vous devez maintenant ajouter des informations sur l'origine de chaque animal.
Vous ne dupliquez plus de code. Maintenant, vous changez des centaines de lignes de code pour les huit espèces d'ours. C'est ainsi que des erreurs se produisent et que des bogues sont introduits.
Alors que vous vous éloignez, votre patron revient encore une fois. Désormais, la haute direction veut également tous les rongeurs du jeu. Oh, et une girafe.
Vous savez que lorsque vous aurez terminé, ils voudront aussi des singes ou autre chose. Il doit y avoir un meilleur moyen.
Au lieu de créer des Tamogatchi de nouvelle génération, vous pouvez toujours jouer avec ceux qui existent déjà.
Afin d'apprivoiser votre ménagerie virtuelle, vous allez devoir vous organiser. L'héritage vous aide à organiser vos classes en leur ajoutant des relations parent et enfant.
Les ours noirs, les grizzlis et les ours paresseux sont tous des ours. Les ours, les rongeurs et les singes sont tous des animaux. Et c'est ainsi que nous allons structurer notre arbre généalogique.
Voici à quoi ressemble une partie du code :
classe Animal {
poids_privé :nombre ;
_origine privée :chaîne ;
constructeur(poids :nombre =0, origine :chaîne ="") {
this._weight =poids ;
this._origin =origine;
}
makeNoise(noise:string ="") {
console.log("a fait un bruit qui ressemblait à :" + noise);
}
manger(nourriture :string ="") {
console.log("mange " + nourriture);
}
sommeil() {
console.log("j'ai bien dormi");
}
errer() {
console.log("errait sans but");
}
}
la classe Ours étend Animal {
constructeur (poids :nombre, origine :chaîne) {
super(poids, origine);
}
makeNoise(noise:string ="rugir") {
super.makeNoise(bruit);
}
manger(nourriture :string ="tout ce qu'il veut") {
super.manger (nourriture);
}
}
la classe GrizzlyBear étend Bear {
constructeur(pondération :nombre =600, origine :chaîne ="Amérique du Nord") {
super(poids, origine);
}
}
la classe Panda étend Ours {
constructeur(poids :nombre =230, origine :chaîne ="Chine") {
super(poids, origine);
}
faire du bruit() {
super.makeNoise("squeek");
}
manger() {
super.eat("pousses et feuilles");
}
}
Vous pouvez jouer avec le code dans le bac à sable TypeScript.
C'était un gros échantillon, mais le code est assez simple et toutes les classes descendent de l'Animal classer. Vous pouvez voir cet ours étend Animal . Et Grizzly Bear et Panda étendre l'ours classer. L'ours la classe crée le son par défaut et manger les fonctions. Le Grizzly Bear classe utilise ces fonctions par défaut, mais le Panda pas.
En d'autres termes, le GrizzlyBear la classe ne remplace pas le ours les fonctions. Parce que Grizzly Bear étend ours , il utilisera les fonctions définies par Bear automatiquement. Mais depuis Panda remplace le makeNoise et manger fonctions, il les utilisera à la place.
Pour déterminer si une classe devrait vraiment étendre une autre classe, vous pouvez vous demander s'il existe une relation "est-un" ou "a-un" entre eux.
Cet exemple est un peu simpliste, mais lorsqu'il s'agit de classes du monde réel, il peut être très utile.
Prêt à appliquer ce que vous avez appris ?
L'héritage est plus qu'un simple code bien organisé. C'est une partie essentielle de la programmation orientée objet. L'héritage permet de rationaliser la communication entre les objets. Et cela permet une conception orientée objet plus avancée, comme avec le polymorphisme. Vous pouvez en savoir plus sur l'héritage dans la documentation TypeScript.