methusalah / optics

An optical simulator in browser
1 stars 1 forks source link

Heritage ! #5

Open methusalah opened 9 years ago

methusalah commented 9 years ago

J'ai parcourut internet et j'ai vu qu'il y avait plusieur methode pour l'heritage.

Il m'a semblait que la plus courante/recente était en utilisant Object.create(monObj), mais du coup je n'ai pas trop compris comment ça manipule l'attribut prototype.

Tu peux me faire un topo rapide de comment tu fais toi?

solendil commented 9 years ago

Je ne fais pas d'héritage en Javascript. Je pense pouvoir dire que personne ou presque ne fait d'héritage en Javascript. Cf. mes précédents commentaires sur le fait de ne pas reproduire le Java :-) Quel est ton cas d'usage concret ?

methusalah commented 9 years ago

En l’occurrence, il s'agit de différencier les Line2D, Ray2D et Segment2D. Ils sont globalement identique mais doivent être traités différemment par mon intersector.

Concrètement, je veux avoir un seul algorithme à qui on envoi deux objets ligne et compagnie, et en fonction de leur type, réalise l'intersection. Le résultat peut être différent entre ligne/ligne, ligne/segment, ray/ligne...

methusalah commented 9 years ago

De la même manière, lorsque je trimbale une library de projet en projet, je passe d'un genre d'objet générique, à des objets plus spécialisé. Par exemple j'utilise souvent un ensemble TileMap/Tile, et j’hérite mon Tile pour y ajouter ce dont j'ai besoin.

methusalah commented 9 years ago

Enfin, l'exemple de notre soft Beam, ou nous avons un item avec un comportement générique, et des chaînes d’héritages vers des objets de plus en plus specialisés

solendil commented 9 years ago

J'ajoute la souplesse dans les données plutôt que dans le code. Par exemple:

line = {ptA:{x:0,y:0},ptB:{x:1,y:1}}
ray = {ptA:{x:0,y:0},ptB:{x:1,y:1},bound:"A"}
segment = {ptA:{x:0,y:0},ptB:{x:1,y:1},bound:"AB"}

Avec un code qui détecte en entrée le type d'objet passé et adapte son comportement. Tu peux aussi ajouter des attributs à posteriori à tes objets. Par exemple segment.lg = 4, ce qui te permet de les enrichir.