Gambas France BETA


Pas de compte ? Incription

probleme de comprehension POO..

Ce sujet est résolu.

1
AuteurMessages
spheris#1 Posté le 31/10/2021 à 08:09:07
Bonjour,
J'essaye tant bien que mal de realiser un programme en pur orienté objet.

Dans une classe, pouvez-vous m'expliquer la différence entre :
1
PROPERTY lechat AS INTEGER


et
1
PRIVATE lechat AS INTEGER


?
Pourquoi utiliser l'un ou l'autre pour déclarer une variable interne à la classe, je ne saisi pas bien.
Merci pour votre aide.

;)
valaquarus#2 Posté le 31/10/2021 à 12:37:11
-- Unus Ex Altera --Bonjour spheris,
je suis très loin de ça mais une recherche sur google m'a donnée un lien intéressant (in english) :

https://stackoverflow.com/questions/3310186/are-there-any-reasons-to-use-private-properties-in-c

c'est sur c++ mais l'idée reste la même.
Philippe
Système d'exploitation : KDE neon 6.0.2 ~ Version Gambas : 3.19.90
spheris#3 Posté le 31/10/2021 à 12:56:43
Merci pour ta réponse, mais je ne comprends pas bien l'idée.
Je vais faire évoluer le site gambaslinux avec de nombreux tutoriels pour migrer vers de la POO avec gambas.
Ce logiciel étant extrêmement puissant, la façon dont je l'utilise au quotidien me semble limité.
Je vais mettre une requete sur la mailing list pour essayer de questionner les plus costauds d'entre nous pour progresser.
;)
Patrick#4 Posté le 4/11/2021 à 17:44:00
Bonsoir,
Un exemple valant mieux qu'un long discours :
Dans Fmain :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
' Gambas class file

PRIVATE $chevalier AS Chevalier

PUBLIC SUB Form_Open()

$chevalier = NEW Chevalier("Lancelot")
$chevalier.armures = Chevalier.cotedemaille
$chevalier.bras = 2
$chevalier.cheval = TRUE
$chevalier.cheveux = Chevalier.blond
$chevalier.jambe = 2
$chevalier.sexe = Chevalier.male

END


Dans Humain.class
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
' Gambas class file

PUBLIC nom AS STRING

PRIVATE $bras AS INTEGER
PRIVATE $jambe AS INTEGER
PRIVATE $cheveux AS INTEGER
PRIVATE $sexe AS INTEGER

PROPERTY READ tete AS INTEGER
PROPERTY bras AS INTEGER
PROPERTY jambe AS INTEGER
PROPERTY READ torse AS INTEGER
PROPERTY cheveux AS INTEGER
PROPERTY sexe AS INTEGER

PUBLIC ENUM brun, chatain, blond, blanc
PUBLIC ENUM male, femmele

PUBLIC SUB _new(nom AS STRING)

ME.nom = nom
Message.Info("L'humain " & nom & " est créé"

END

PRIVATE FUNCTION tete_Read() AS INTEGER

RETURN 1

END

PRIVATE FUNCTION bras_Read() AS INTEGER

RETURN $bras

END

PRIVATE SUB bras_Write(Value AS INTEGER)

IF value > 2 THEN
Message.Error("Impossible", "Ok")
$bras = -1
ELSE
$bras = value
ENDIF

END

PRIVATE FUNCTION jambe_Read() AS INTEGER

RETURN $jambe

END

PRIVATE SUB jambe_Write(Value AS INTEGER)

IF value > 2 THEN
Message.Error("Impossible", "Ok")
$jambe = -1
ELSE
$jambe = value
ENDIF

END

PRIVATE FUNCTION torse_Read() AS INTEGER

RETURN 1

END

PRIVATE FUNCTION cheveux_Read() AS INTEGER

RETURN $cheveux

END

PRIVATE SUB cheveux_Write(Value AS INTEGER)

$cheveux = value

END

PRIVATE FUNCTION sexe_Read() AS INTEGER

RETURN $sexe

END

PRIVATE SUB sexe_Write(Value AS INTEGER)

$sexe = value

END


Dans Chavalier.class

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
INHERITS Humain

PRIVATE $armure AS INTEGER
PRIVATE $cheval AS BOOLEAN

PROPERTY armures AS INTEGER
PROPERTY cheval AS BOOLEAN

PUBLIC ENUM fer, acier, cotedemaille

PUBLIC SUB _new()

Message.Info("Le chevalier " & ME.nom & " est créé"

END

PRIVATE FUNCTION armures_Read() AS INTEGER

RETURN $armure

END

PRIVATE SUB armures_Write(Value AS INTEGER)

$armure = Value

END

PRIVATE FUNCTION cheval_Read() AS BOOLEAN

RETURN $cheval

END

PRIVATE SUB cheval_Write(Value AS BOOLEAN)

$cheval = Value

END


Ce qui est intéressant c'est que la class Chevalier hérite de toutes les propriétés de la class Humain, on pourrait imaginer la class noble qui hérite de chevalier et la class roi qui hérite de noble avec chacune ses propriétés spécifiques ... Voir même ré écrites.
Patrick
spheris#5 Posté le 5/11/2021 à 09:00:20
Patrick,
un grand merci. Pour ma compréhension, permets moi de détailler ce code pour voir si j'ai bien tout compris :

Pour le Fmain :
1
2
3
4
5
6
7
8
9
10
11
' Gambas class file
PRIVATE $chevalier AS Chevalier 'cette instance sera visible que dans le Form là
PUBLIC SUB Form_Open()
$chevalier = NEW Chevalier("Lancelot") 'fait référence à la variable 'nom'
$chevalier.armures = Chevalier.cotedemaille 'Fait reference a la variable enumérée cotedemaille
$chevalier.bras = 2
$chevalier.cheval = TRUE
$chevalier.cheveux = Chevalier.blond
$chevalier.jambe = 2
$chevalier.sexe = Chevalier.male
END


Pour la classe humain:
1
2
3
4
5
PUBLIC nom AS STRING 'Cette variable est une simple variable accessible depuis n'importe quelle instance crée.
PRIVATE $bras AS INTEGER 'cette variable n'est utilisée que par la classe elle meme
PRIVATE $jambe AS INTEGER 'idem
PRIVATE $cheveux AS INTEGER'idem
PRIVATE $sexe AS INTEGER'idem

PROPERTY READ tete AS INTEGER :C'est une propriété de la classe en lecture seule qui est liée à sa fonction:
1
2
3
PRIVATE FUNCTION tete_Read() AS INTEGER
RETURN 1
END


PROPERTY bras AS INTEGER : 'propriété de classe en lecture ecriture qui peut recevoir une valeur value et qui peut renvoyer une valeur dans sa fonction propre:

1
2
3
4
5
6
7
PRIVATE FUNCTION bras_Read() AS INTEGER
RETURN $bras
END

PRIVATE SUB bras_Write(Value AS INTEGER)
$bras = Value
END


Ce qui est intéressant avec l'IDE de gambas, c'est qu'il nous mache le travail en créant les deux fonctions liées quand tu saisis PROPERTY.

PUBLIC ENUM brun, chatain, blond, blanc: Je comprends que cela doit être des variables, mais je ne sais, ni comment les utiliser, ni quel types doivents elle avoir, peux-tu m'éclairer là desssus?

;-)
Patrick#6 Posté le 5/11/2021 à 17:32:18
Ce sont des constantes de type Integer, brun = 0 jusqu’à blanc = 3, ENUM peut être PRIVATE.
Je l'utilise aussi beaucoup pour les GridView et les tableaux. C'est plus facile de lire et de maintenir un programme qui utilise des noms plutôt que des numéros : MonTableau[brun] est plus parlant que MonTableau[0]. Si on se rend compte que l'on a oublié une colonne (roux par ex) on peut l'intercaler sans avoir à renuméroter tous son programme.
Dans le petit exemple pour être complet il manque Event/Raise qui permet de communiquer avec la class appelante. Voici ce qui changerait :
Dans Fmain
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
' Gambas class file

PRIVATE $chevalier AS Chevalier

PUBLIC SUB Form_Open()

$chevalier = NEW Chevalier("Lancelot", ME) AS "chevaliers"
$chevalier.armures = Chevalier.cotedemaille
$chevalier.bras = 2
$chevalier.cheval = TRUE
$chevalier.cheveux = Chevalier.blond
$chevalier.jambe = 2
$chevalier.sexe = Chevalier.male

END

PUBLIC SUB chevaliers_click(Value AS INTEGER)

Message.Info("Chevalier a cliqué : " Str(value))

END


Dans Humain
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
' Gambas class file

PUBLIC nom AS STRING

PRIVATE $bras AS INTEGER
PRIVATE $jambe AS INTEGER
PRIVATE $cheveux AS INTEGER
PRIVATE $sexe AS INTEGER
PRIVATE $but AS Button
PRIVATE $clic AS INTEGER

PROPERTY READ tete AS INTEGER
PROPERTY bras AS INTEGER
PROPERTY jambe AS INTEGER
PROPERTY READ torse AS INTEGER
PROPERTY cheveux AS INTEGER
PROPERTY sexe AS INTEGER

EVENT click(Value AS INTEGER)

PUBLIC ENUM brun, chatain, blond, blanc
PUBLIC ENUM male, femmele

PUBLIC SUB _new(nom AS STRING, win AS Window)

ME.nom = nom
Message.Info("L'humain " & nom & " est créé"
$but = NEW Button(win) AS "but"
$but.Text = nom
$but.Height = 25
$but.Width = 150

END

PUBLIC SUB but_click()

$clic += 1
RAISE click($clic)

END

spheris#7 Posté le 7/11/2021 à 19:33:18
Patrick merci j'ai tout compris maintenant.
J'avais commencé un logiciel , un clone de TCI un créateur de typon pour électronique mais je me suis vite perdu dans le code manquant de connaissances en POO.
Je vais essayer de le réécrire en Objet pour me faire la main :

http://gambaslinux.fr/articles.php?lng=fr&pg=2169

Merci pour tes précieux conseils.
Un tuto verra probablement le jour très bientôt sur gambaslinux.fr
;)

spheris#8 Posté le 12/11/2021 à 20:45:11
sujet fermé.
1