Instanciasion et heritage des modules

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Instanciasion et heritage des modules

Message 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:
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Instanciasion et heritage des modules

Message 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:
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Instanciasion et heritage des modules

Message 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.
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 !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Instanciasion et heritage des modules

Message par Backup »

Merci :)
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Instanciasion et heritage des modules

Message 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...
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Instanciasion et heritage des modules

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

Dernière modification par graph100 le mer. 06/août/2014 10:52, modifié 1 fois.
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Instanciasion et heritage des modules

Message 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.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Instanciasion et heritage des modules

Message 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...
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Instanciasion et heritage des modules

Message par microdevweb »

Merci Graph100,

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
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Instanciasion et heritage des modules

Message 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
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Instanciasion et heritage des modules

Message 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))
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Fred
Site Admin
Messages : 2648
Inscription : mer. 21/janv./2004 11:03

Re: Instanciasion et heritage des modules

Message par Fred »

Si tu utilises PB 5.30, tu peux utliser AllocateStructure()
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Instanciasion et heritage des modules

Message 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
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Instanciasion et heritage des modules

Message 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:
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Répondre