Page 1 sur 1

Instanciasion et heritage des modules

Publié : mar. 05/août/2014 13:05
par microdevweb
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 :lol:

Re: Instanciasion et heritage des modules

Publié : mar. 05/août/2014 14:20
par Backup
microdevweb a écrit :Bonjour,
Je trouverais génial de pouvoir instancier

J'ai jamais compris ce que ça voulait dire ! 8O "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 :lol:

Re: Instanciasion et heritage des modules

Publié : mar. 05/août/2014 15:41
par Micoute
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.

Re: Instanciasion et heritage des modules

Publié : mar. 05/août/2014 17:08
par Backup
Merci :)

Re: Instanciasion et heritage des modules

Publié : mer. 06/août/2014 8:39
par microdevweb
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

Code : Tout sélectionner

mesVoitures.voiture()\X
, 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

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 
et à juste mettre des boutons (procédures) accessibles aux autres par exemple

Code : Tout sélectionner

Voiture::Avance()
grâce a
exemple:

Code : Tout sélectionner

DeclareModule Voiture
    Declare Avance()

EndDeclareModule
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

Code : Tout sélectionner

Module Voiture()
  Structure Voiture
     Puissance.i
     Couleur.i
  EndStructure
  Global NewList mesVoitures.Voitures()
Endmodule
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)

Code : Tout sélectionner

Peugeot.Voiture
Fiat.Voiture
Peugeot::Avance()
Fiat::Avance()
L’héritage quant à lui permettrait de créer un nouveau module avec les propriété de module ancêtre
Exemple non fonctionnel

Code : Tout sélectionner

Module VoitureSport extends Voiture

Endmodule
Et de pouvoir ajouter ses propre fonctions,variables, sans modifier le module ancêtre

Voila j'espère avoir éclairé ta lanterne...

Re: Instanciasion et heritage des modules

Publié : mer. 06/août/2014 9:15
par graph100
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.

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()


Re: Instanciasion et heritage des modules

Publié : mer. 06/août/2014 9:38
par microdevweb
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.

Re: Instanciasion et heritage des modules

Publié : mer. 06/août/2014 9:50
par graph100
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...

Re: Instanciasion et heritage des modules

Publié : mer. 06/août/2014 9:52
par microdevweb
Merci Graph100,

Je suis en train de tester ton exemple...

Re: Instanciasion et heritage des modules

Publié : mer. 06/août/2014 10:31
par microdevweb

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()
Voila graph 100, j'ai étudié ton exemple et cela fonctionne, mais je penses qu'il faut prévoir un destructeur car cela plante de temps à autre

Re: Instanciasion et heritage des modules

Publié : mer. 06/août/2014 10:48
par microdevweb
Petite modif faite

Code : Tout sélectionner

*v.S_Voiture=AllocateMemory(SizeOf(S_Voiture))
et non

Code : Tout sélectionner

*v.S_Voiture=AllocateMemory(SizeOf(Voiture))

Re: Instanciasion et heritage des modules

Publié : mer. 06/août/2014 11:01
par Fred
Si tu utilises PB 5.30, tu peux utliser AllocateStructure()

Re: Instanciasion et heritage des modules

Publié : mer. 06/août/2014 12:49
par graph100
@microdevweb : je m'en suis aperçus après l'avoir posté :D , 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 :

Code : Tout sélectionner

Inherit Nom_du_Module
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 !

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

Re: Instanciasion et heritage des modules

Publié : mer. 06/août/2014 14:48
par graph100
Voila !! enfin quelque chose qui me plait :mrgreen:

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 :wink: