Instanciasion et heritage des modules
- microdevweb
- Messages : 1798
- Inscription : mer. 29/juin/2011 14:11
- Localisation : Belgique
Instanciasion et heritage des modules
Bonjour,
Perso j'utilise pas mal les modules pour leurs encapsulation est qui vraiment pratique pour une réutilisation futur du code. Je trouverais génial de pouvoir instancier un module et de pouvoir en créer un nouveau avec un héritage d'un autre.
Bon je sais que la ça se rapproche de la poo mais se serait vraiment top
Perso j'utilise pas mal les modules pour leurs encapsulation est qui vraiment pratique pour une réutilisation futur du code. Je trouverais génial de pouvoir instancier un module et de pouvoir en créer un nouveau avec un héritage d'un autre.
Bon je sais que la ça se rapproche de la poo mais se serait vraiment top
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Work at Centre Spatial de Liège
Re: Instanciasion et heritage des modules
microdevweb a écrit :Bonjour,
Je trouverais génial de pouvoir instancier
J'ai jamais compris ce que ça voulait dire ! "instancier ,heritage" ....
deja , je ne comprends pas pourquoi ils changent les noms...
"méthodes" au lieu de Procedure/Fonction
"classe" au lieu de Librairie ? (si j'ai a peu pret compris ..)
comment se mettre a la POO , alors qu'il faut deja apprendre la langue chinois pour arriver a lire le manuel
Re: Instanciasion et heritage des modules
Bonjour Dobro, je vais essayer d'éclairer un peu ta lanterne, car j'ai perdu beaucoup de pratique.
Imaginons un point, un point, c'est une coordonnée X et Y. Donc je peux faire une méthode qui hérite du point, par exemple la ligne qui est une suite de points et je peux aussi hériter de la ligne avec le cadre qui est une suite de lignes, en gros, c'est ça l'héritage.
Une classe, c'est en fait une bibliothèque de fonctions qui permet de gérer les objets que tu as créés.
http://drac.site.chez-alice.fr/Tutorial ... ses_PB.htm
voilà la façon la plus simple pour expliquer la programmation orientée objet.
Imaginons un point, un point, c'est une coordonnée X et Y. Donc je peux faire une méthode qui hérite du point, par exemple la ligne qui est une suite de points et je peux aussi hériter de la ligne avec le cadre qui est une suite de lignes, en gros, c'est ça l'héritage.
Une classe, c'est en fait une bibliothèque de fonctions qui permet de gérer les objets que tu as créés.
http://drac.site.chez-alice.fr/Tutorial ... ses_PB.htm
voilà la façon la plus simple pour expliquer la programmation orientée objet.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Un homme doit être poli, mais il doit aussi être libre !
- microdevweb
- Messages : 1798
- Inscription : mer. 29/juin/2011 14:11
- Localisation : Belgique
Re: Instanciasion et heritage des modules
Ou si tu veux Dobro.
Tu crée un jeu avec des voitures, tu veux des voitures puissantes des moins puissante des rouge des vertes ect
Actuellement avec Pb tu créerais une structure voiture qui reprendrais la couleur, la puissance ect et une liste chainée mesVoiture.voiture()
En autre par exemple, l'élément de la liste chaine mesVoitures est une instance de la structure voiture avec c'est propre valeur qui a été ajoutée avec .
Ensuite tu créerais tes procédures et fonction pour faire avancer ta voiture.
Imagine que vous travailler sur le jeu à plusieurs et que les autres doivent utiliser ton code pour faire avancer les engins. Ce sera beaucoup plus facile pour eu si tu utilise un module en pb, classe en C++ par exemple.
Ca revient simplement à tout mettre dans un boîte fermée et inaccessible depuis l'extérieur (encapsulation), les structures les procédures ect par exemple en pb tous ce qui est entre ces balises et à juste mettre des boutons (procédures) accessibles aux autres par exemple grâce a
exemple:
Le problème actuellement, si je veux gérer plusieurs voitures, je serais obligé d'utiliser dans mon module une liste chainée reprenant chaque voiture
exemple
Et à chaque procédure de stipuler de quel élément de la liste chainée il s’agit
Si ou pouvais instancier les modules cela donnerais plutôt ceci (exemple non fonctionnel)
L’héritage quant à lui permettrait de créer un nouveau module avec les propriété de module ancêtre
Exemple non fonctionnel
Et de pouvoir ajouter ses propre fonctions,variables, sans modifier le module ancêtre
Voila j'espère avoir éclairé ta lanterne...
Tu crée un jeu avec des voitures, tu veux des voitures puissantes des moins puissante des rouge des vertes ect
Actuellement avec Pb tu créerais une structure voiture qui reprendrais la couleur, la puissance ect et une liste chainée mesVoiture.voiture()
En autre par exemple
Code : Tout sélectionner
mesVoitures.voiture()\X
Code : Tout sélectionner
Addelement(myVoiture.voiture())
Ensuite tu créerais tes procédures et fonction pour faire avancer ta voiture.
Imagine que vous travailler sur le jeu à plusieurs et que les autres doivent utiliser ton code pour faire avancer les engins. Ce sera beaucoup plus facile pour eu si tu utilise un module en pb, classe en C++ par exemple.
Ca revient simplement à tout mettre dans un boîte fermée et inaccessible depuis l'extérieur (encapsulation), les structures les procédures ect par exemple en pb tous ce qui est entre ces balises
Code : Tout sélectionner
Module Voiture Endmodule
Code : Tout sélectionner
Voiture::Avance()
exemple:
Code : Tout sélectionner
DeclareModule Voiture
Declare Avance()
EndDeclareModule
exemple
Code : Tout sélectionner
Module Voiture()
Structure Voiture
Puissance.i
Couleur.i
EndStructure
Global NewList mesVoitures.Voitures()
Endmodule
Si ou pouvais instancier les modules cela donnerais plutôt ceci (exemple non fonctionnel)
Code : Tout sélectionner
Peugeot.Voiture
Fiat.Voiture
Peugeot::Avance()
Fiat::Avance()
Exemple non fonctionnel
Code : Tout sélectionner
Module VoitureSport extends Voiture
Endmodule
Voila j'espère avoir éclairé ta lanterne...
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Work at Centre Spatial de Liège
Re: Instanciasion et heritage des modules
Je n'ai pas trop bien saisie ton exemple.
Mais actuellement, tu peux très bien faire la chose suivante avec les interfaces ! Et il me semble que tu mélange les deux. Après c'est sur que Pb n'est pas fait pour ça, et qu'il faudrait ajouter / changer un comportement pour pouvoir faire réellement de poo si on le veut.
Mais actuellement, tu peux très bien faire la chose suivante avec les interfaces ! Et il me semble que tu mélange les deux. Après c'est sur que Pb n'est pas fait pour ça, et qu'il faudrait ajouter / changer un comportement pour pouvoir faire réellement de poo si on le veut.
Code : Tout sélectionner
DeclareModule Voiture
Interface Voiture
Avance(Vitesse.d)
GetPuissance.l()
EndInterface
Declare.i CreateVoiture()
EndDeclareModule
Module Voiture
; Structure des données
Structure S_Voiture
*Itf ; pour l'interface !
Puissance.i
Couleur.i
x.l
EndStructure
; Création de l'objet.
Procedure.i CreateVoiture()
*v.S_Voiture = AllocateMemory(SizeOf(S_Voiture))
InitializeStructure(*v, Voiture)
*v\Itf = ?interface_function
*v\x = 50
*v\Puissance = 1000
ProcedureReturn *v
EndProcedure
; Méthodes
Procedure Avance(*v.S_Voiture, v.d)
*v\x + v
Debug *v\x
EndProcedure
Procedure.l Get_Puissance(*v.S_Voiture)
ProcedureReturn *v\Puissance
EndProcedure
; Adresses des fonctions pour l'interface
DataSection
interface_function:
Data.i @Avance()
Data.i @Get_Puissance()
EndDataSection
EndModule
NewList *Voiture.Voiture::Voiture()
AddElement(*Voiture())
*Voiture() = Voiture::CreateVoiture()
*Voiture()\Avance(1)
Debug *Voiture()\GetPuissance()
Dernière modification par graph100 le mer. 06/août/2014 10:52, modifié 1 fois.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel )
Mon site : CeriseCode (Attention Chantier perpétuel )
- microdevweb
- Messages : 1798
- Inscription : mer. 29/juin/2011 14:11
- Localisation : Belgique
Re: Instanciasion et heritage des modules
Merci graph100,
J'avais un peux regarder les interfaces et le travaille de Dark, mais je n'ai pas trouvé dans ses exemple l'encapsulation des données.
J'avais un peux regarder les interfaces et le travaille de Dark, mais je n'ai pas trouvé dans ses exemple l'encapsulation des données.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Work at Centre Spatial de Liège
Re: Instanciasion et heritage des modules
je suis en train de te faire un exemple d'héritage mais c'est une galère monstre à cause des procédures privée !! il faut recréer la table d'adressage, et c'est là le problème...
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel )
Mon site : CeriseCode (Attention Chantier perpétuel )
- microdevweb
- Messages : 1798
- Inscription : mer. 29/juin/2011 14:11
- Localisation : Belgique
Re: Instanciasion et heritage des modules
Merci Graph100,
Je suis en train de tester ton exemple...
Je suis en train de tester ton exemple...
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Work at Centre Spatial de Liège
- microdevweb
- Messages : 1798
- Inscription : mer. 29/juin/2011 14:11
- Localisation : Belgique
Re: Instanciasion et heritage des modules
Code : Tout sélectionner
DeclareModule Voiture
Interface Voiture
Avance(DepX.d,DepY.d)
GetPosX.l()
GetPosY.l()
EndInterface
Declare.i CreateVoiture(color,puissance)
EndDeclareModule
Module Voiture
Structure S_Voiture
*Interface
X.i
Y.i
puissance.i
couleur.i
EndStructure
Procedure CreateVoiture(color,puissance)
*v.S_Voiture=AllocateMemory(SizeOf(S_Voiture))
InitializeStructure(*v,Voiture)
*v\Interface=?interface_function
*v\couleur=color
*v\puissance=puissance
*v\X=0
*v\Y=0
ProcedureReturn *v
EndProcedure
Procedure Avance(*v.S_Voiture,DepX.d,DepY.d)
*v\X+DepX
*v\Y+DepY
EndProcedure
Procedure.l GetPosX(*v.S_Voiture)
ProcedureReturn *v\X
EndProcedure
Procedure.l GetPosY(*v.S_Voiture)
ProcedureReturn *v\Y
EndProcedure
DataSection
interface_function:
Data.i @Avance()
Data .i @GetPosX()
Data .i @GetPosY()
EndDataSection
EndModule
NewList *Voiture.Voiture::Voiture()
AddElement(*Voiture())
*Voiture()=Voiture::CreateVoiture(1,10)
*Voiture()\Avance(10,60)
Debug *Voiture()\GetPosX()
AddElement(*Voiture())
*Voiture()=Voiture::CreateVoiture(1,10)
*Voiture()\Avance(80,60)
Debug *Voiture()\GetPosX()
*Fiat.Voiture::Voiture
*Fiat=Voiture::CreateVoiture(1,60)
*Fiat\Avance(10,80)
Debug *Fiat\GetPosX()
*Ford.Voiture::Voiture
*Ford=Voiture::CreateVoiture(1,60)
*Ford\Avance(70,80)
Debug *Ford\GetPosX()
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Work at Centre Spatial de Liège
- microdevweb
- Messages : 1798
- Inscription : mer. 29/juin/2011 14:11
- Localisation : Belgique
Re: Instanciasion et heritage des modules
Petite modif faite
et non
Code : Tout sélectionner
*v.S_Voiture=AllocateMemory(SizeOf(S_Voiture))
Code : Tout sélectionner
*v.S_Voiture=AllocateMemory(SizeOf(Voiture))
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Work at Centre Spatial de Liège
Re: Instanciasion et heritage des modules
Si tu utilises PB 5.30, tu peux utliser AllocateStructure()
Re: Instanciasion et heritage des modules
@microdevweb : je m'en suis aperçus après l'avoir posté , beau coup d’œil, c'est corrigé. (au début ma structure avait le nom de l'interface)
@Fred : pour le moment je code toujours principalement sur la LTS. même si la nouvelle version me fait beaucoup baver.
Voila ce à quoi je suis arrivé pour avoir un semblant d'héritage.
Bien sur l'idéal serait de juste avoir à mettre un truc du genre :
mais bon, ce n'est pas possible.
Je vais essayer de faire un truc plus général. Un peu comme luis, ICI
Très beau boulot, simplement c'était avant les modules !
@Fred : pour le moment je code toujours principalement sur la LTS. même si la nouvelle version me fait beaucoup baver.
Voila ce à quoi je suis arrivé pour avoir un semblant d'héritage.
Bien sur l'idéal serait de juste avoir à mettre un truc du genre :
Code : Tout sélectionner
Inherit Nom_du_Module
Je vais essayer de faire un truc plus général. Un peu comme luis, ICI
Très beau boulot, simplement c'était avant les modules !
Code : Tout sélectionner
;{ MODULE Voiture
DeclareModule Voiture
Structure ClassInfo
*vTable
ClassName.s
EndStructure
Global ClassInfo.ClassInfo
; fonctions
Interface Function
Free()
Avance(Vitesse.d)
GetPuissance.l()
EndInterface
; Déclaration du constructeur
Declare.i Create()
; Structure des données
Structure Struct_DATA
*vTable ; pour l'interface !
Puissance.i
Couleur.i
x.l
EndStructure
EndDeclareModule
Module Voiture
ClassInfo\vTable = AllocateMemory(SizeOf(Function))
ClassInfo\ClassName = #PB_Compiler_Module
_function_count_ = 0
Macro ADD_Function(_Function_)
PokeI(ClassInfo\vTable + _function_count_ * SizeOf(Integer), _Function_)
_function_count_ + 1
EndMacro
; Constructeur
Procedure.i Create()
*v.Struct_DATA = AllocateMemory(SizeOf(Struct_DATA))
InitializeStructure(*v, Struct_DATA)
*v\vTable = ClassInfo\vTable
*v\x = 50
*v\Puissance = 1000
ProcedureReturn *v
EndProcedure
; Méthodes
Procedure Avance(*v.Struct_DATA, v.d)
*v\x + v
Debug *v\x
EndProcedure
Procedure.l Get_Puissance(*v.Struct_DATA)
ProcedureReturn *v\Puissance
EndProcedure
; Destructeur
Procedure Free(*v.Struct_DATA)
ClearStructure(*v, Struct_DATA)
FreeMemory(*v)
EndProcedure
; Ajout des fonctions dans la vTable
ADD_Function(@Free())
ADD_Function(@Avance())
ADD_Function(@Get_Puissance())
EndModule
;}
;{ MODULE Peugeot
DeclareModule Peugeot
Structure ClassInfo
*vTable
ClassName.s
EndStructure
Global ClassInfo.ClassInfo
Interface Function Extends Voiture::Function
GetName.s()
EndInterface
; Déclaration du constructeur
Declare.i Create()
; Structure des données
Structure Struct_DATA Extends Voiture::Struct_DATA
name.s
EndStructure
EndDeclareModule
Module Peugeot
ClassInfo\vTable = AllocateMemory(SizeOf(Function))
ClassInfo\ClassName = #PB_Compiler_Module
_function_count_ = 0
Macro ADD_Function(_Function_)
PokeI(ClassInfo\vTable + _function_count_ * SizeOf(Integer), _Function_)
_function_count_ + 1
EndMacro
;{ héritage
CopyMemory(Voiture::ClassInfo\vTable, ClassInfo\vTable, SizeOf(Voiture::Function))
_function_count_ = SizeOf(Voiture::Function) / SizeOf(Integer)
;}
; Destructeur
Procedure Free(*v.Struct_DATA)
ClearStructure(*v, Struct_DATA)
FreeMemory(*v)
EndProcedure
; Création de l'objet.
Procedure.i Create()
;{ partie commune
*v.Struct_DATA = AllocateMemory(SizeOf(Struct_DATA))
InitializeStructure(*v, Struct_DATA)
*v\vTable = ClassInfo\vTable
; override de la fonction free()
PokeI(*v\vTable + OffsetOf(Function\Free()), @Free())
;}
*v\x = 50
*v\Puissance = 2000
*v\name = "Pouet"
ProcedureReturn *v
EndProcedure
; Méthodes
Procedure.s Get_Name(*v.Struct_DATA)
ProcedureReturn *v\name
EndProcedure
; Ajout des fonctions dans la vTable
ADD_Function(@Get_Name())
EndModule
;}
Debug "voiture"
Debug " "
*Voiture.Voiture::Function = Voiture::Create()
*Voiture\Avance(1)
Debug *Voiture\GetPuissance()
Debug " "
Debug "Peugeot"
Debug " "
*peugeot.Peugeot::Function = Peugeot::Create()
*peugeot\Avance(10)
Debug *peugeot\GetPuissance()
Debug *peugeot\GetName()
Debug ""
Debug "info générale : "
Debug Voiture::ClassInfo\ClassName
Debug Peugeot::ClassInfo\ClassName
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel )
Mon site : CeriseCode (Attention Chantier perpétuel )
Re: Instanciasion et heritage des modules
Voila !! enfin quelque chose qui me plait
J'ai posté là : POO : Module de Class générique et Template, pour ne pas continuer dans "Suggestions et améliorations" cette intéressante discussion !
Dis moi si c'est à peu près pratique
J'ai posté là : POO : Module de Class générique et Template, pour ne pas continuer dans "Suggestions et améliorations" cette intéressante discussion !
Dis moi si c'est à peu près pratique
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel )
Mon site : CeriseCode (Attention Chantier perpétuel )