Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Heritage ou pas ?

11 réponses
Avatar
Fabien LE LEZ
Bonjour,

J'essaie de faire un programme qui fait une capture d'écran sur un
poste, et affiche cette capture sur un autre poste (un peu comme VNC).

J'ai donc une classe Bitmap, qui sert à deux choses :
- sur le premier poste, elle effectue la capture d'écran, et
envoie les données
- sur le second poste, elle récupère les données, puis affiche
l'image à l'écran

class Bitmap
{
public :

// fonctions générales
Bitmap();
int NbOctetsParLigne();

// fonctions spécifiques au 1er poste
void CaptureEcran (Ecran*);
void EnvoieDonnees (SOCKET);

// fonctions spécifiques au 2è poste
void RecupereDonnees (SOCKET);
void AfficheBitmap (Ecran*);

private:
// Données privées, communes
};

Et là j'hésite : dois-je laisser ma classe comme ça, ou serait-il
mieux que je fasse une classe de base, plus deux classes dérivées
Bitmap_reception (contenant "RecupereDonnees()" et "AfficheBitmap()")
et Bitmap_envoi (contenant "CaptureEcran()" et "EnvoieDonnees()") ?
Ça empêcherait qu'on appelle EnvoieDonnees() sur un objet prévu pour
la réception, mais le jeu en vaut-il la chandelle ?

Merci d'avance pour vos avis...

--
http://www.giromini.org/usenet-fr/repondre.html

10 réponses

1 2
Avatar
Jonathan Mcdougall
J'ai donc une classe Bitmap, qui sert à deux choses :
- sur le premier poste, elle effectue la capture d'écran, et
envoie les données
- sur le second poste, elle récupère les données, puis affiche
l'image à l'écran


<snip>

Et là j'hésite : dois-je laisser ma classe comme ça, ou serait-il
mieux que je fasse une classe de base, plus deux classes dérivées
Bitmap_reception (contenant "RecupereDonnees()" et "AfficheBitmap()")
et Bitmap_envoi (contenant "CaptureEcran()" et "EnvoieDonnees()") ?
Ça empêcherait qu'on appelle EnvoieDonnees() sur un objet prévu pour
la réception, mais le jeu en vaut-il la chandelle ?


Ça me rappelle l'exemple de Stroustrup (je crois) avec les pingouins
qui héritaient de la classe oiseau, mais qui affichaient une erreur
quand on voulait les faire voler. Quelque chose comme "It's ok for
them to fly, but they can't."

Mais pourquoi ne pas faire deux classes séparées si elles font des
choses différentes? amha, il n'y a aucun héritage ici. Mais je
me plante peut-être.


Jonathan

Avatar
Jonathan Mcdougall
"It's ok for
them to fly, but they can't."


Un bon coup de pied à l'endroit adéquat, et tu verras qu'ils sont
capables de voler. Et vu le climat, on retrouve le "How to freeze your
own foot" ;-)


:)

Mais pourquoi ne pas faire deux classes séparées si elles font des
choses différentes?


Les variables, et quelques fonctions, sont communes.
En fait les deux sont des bitmaps, i.e. des classes qui stockent une
image pour faire la liaison entre l'écran et le réseau.


Je ne suis pas sur de comprendre l'utilité même de la classe, mais
je crois qu'une bonne approche serait que la représentation soit
dans une classe à part avec des fonctions statiques qui y sont
liées (s'il y en a).

Tes deux classes (Save et Load) devraient contenir une instance
chacune de cette représentation.

Si tu as encore des fonctions communes, fait une autre classe
(quelque chose comme BitmapOperations) pour ces deux et fait les
hériter privatement ou même, met les statiques ou freestanding.


Jonathan


Avatar
Fabien LE LEZ
On Mon, 6 Oct 2003 20:40:24 -0400, "Jonathan Mcdougall"
wrote:

"It's ok for
them to fly, but they can't."


Un bon coup de pied à l'endroit adéquat, et tu verras qu'ils sont
capables de voler. Et vu le climat, on retrouve le "How to freeze your
own foot" ;-)

Mais pourquoi ne pas faire deux classes séparées si elles font des
choses différentes?


Les variables, et quelques fonctions, sont communes.
En fait les deux sont des bitmaps, i.e. des classes qui stockent une
image pour faire la liaison entre l'écran et le réseau.

--
http://www.giromini.org/usenet-fr/repondre.html

Avatar
Jonathan Mcdougall
"It's ok for
them to fly, but they can't."





Maintenant que j'y pense, c'était

"They can fly, but it is an error for them to do so"


Jonathan



Avatar
Loïc Joly
Fabien LE LEZ wrote:
On Mon, 6 Oct 2003 20:40:24 -0400, "Jonathan Mcdougall"
wrote:
Mais pourquoi ne pas faire deux classes séparées si elles font des
choses différentes?



Les variables, et quelques fonctions, sont communes.
En fait les deux sont des bitmaps, i.e. des classes qui stockent une
image pour faire la liaison entre l'écran et le réseau.


En ce cas là, pourquoi pas deux classes distincte (l'une BitmapClient,
l'autre BitmapServer) qui utilisent toutes deux une variable Bitmap dans
leur implémentation ?

--
Loïc


Avatar
David Brabant
"Fabien LE LEZ" wrote

J'ai donc une classe Bitmap, qui sert à deux choses :
- sur le premier poste, elle effectue la capture d'écran, et
envoie les données
- sur le second poste, elle récupère les données, puis affiche
l'image à l'écran


Tu ne penses pas que l'envoi et la réception du bitmap
devrait faire l'objet d'une (ou deux) classe(s) séparée(s)
offrant ces services, classe(s) utilisée(s) (composition)
par Bitmap? C'est ce que je ferais personnellement plutôt
que d'avoir recours à l'héritage.

--
David

Avatar
Marc Boyer
Fabien LE LEZ wrote:
Bonjour,

J'essaie de faire un programme qui fait une capture d'écran sur un
poste, et affiche cette capture sur un autre poste (un peu comme VNC).

J'ai donc une classe Bitmap, qui sert à deux choses :
- sur le premier poste, elle effectue la capture d'écran, et
envoie les données
- sur le second poste, elle récupère les données, puis affiche
l'image à l'écran


Je crois qu'il faudrait surtout une délégation (si c'est bien le mot).
Tu as 3 objets, un Bitmap, un Captureur et un Afficheur.
Captureur a un champ Bitmap, et Afficheur a surement
un champ /const/ Bitmap.

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(

Avatar
Frédéri MIAILLE
"Fabien LE LEZ" a écrit dans le message de
news:
Bonjour,

J'essaie de faire un programme qui fait une capture d'écran sur un
poste, et affiche cette capture sur un autre poste (un peu comme VNC).

J'ai donc une classe Bitmap, qui sert à deux choses :
- sur le premier poste, elle effectue la capture d'écran, et
envoie les données
- sur le second poste, elle récupère les données, puis affiche
l'image à l'écran

class Bitmap
{
public :

// fonctions générales
Bitmap();
int NbOctetsParLigne();

// fonctions spécifiques au 1er poste
void CaptureEcran (Ecran*);
void EnvoieDonnees (SOCKET);

// fonctions spécifiques au 2è poste
void RecupereDonnees (SOCKET);
void AfficheBitmap (Ecran*);

private:
// Données privées, communes
};

Et là j'hésite : dois-je laisser ma classe comme ça, ou serait-il
mieux que je fasse une classe de base, plus deux classes dérivées
Bitmap_reception (contenant "RecupereDonnees()" et "AfficheBitmap()")
et Bitmap_envoi (contenant "CaptureEcran()" et "EnvoieDonnees()") ?
Ça empêcherait qu'on appelle EnvoieDonnees() sur un objet prévu pour
la réception, mais le jeu en vaut-il la chandelle ?
Oui car l'utilisateur de ta classe lui est une personne en laquelle tu ne

peux pas avoir confiance.
Autre chose, "AfficheBitmap (Ecran*);" est une fonction que l'utilisateur
va certainement appeler sans avoir appelé préalablement
"RecupereDonnees(SOCKET);".

--
Frédéri MIAILLE
fr.comp.lang.c
fr.comp.lang.c++
fr.comp.graphisme.programmation
fr.comp.os.ms-windows.programmation

Avatar
Fabien LE LEZ
On Tue, 7 Oct 2003 09:27:41 +0200, "David Brabant"
wrote:

Tu ne penses pas que l'envoi et la réception du bitmap
devrait faire l'objet d'une (ou deux) classe(s) séparée(s)
offrant ces services, classe(s) utilisée(s) (composition)
par Bitmap?


En fait les fonctions de Bitmap sont vraiment directement liées à ses
données : elles ne font en fait que transformer la représentation
interne soit en flux d'octets (pour le réseau), soit en BMP
reconnaissable par Windows (et les fonctions inverses qui font les
transformation dans l'autre sens). Elles sont une interface publique
assez "basique" de la classe, i.e. des fonctions n'ayant pas accès
direct aux variables membres ne pourraient pas faire correctement le
boulot.

--
http://www.giromini.org/usenet-fr/repondre.html

Avatar
Fabien LE LEZ
On Tue, 7 Oct 2003 14:22:07 +0200, "Frédéri MIAILLE"
wrote:

Autre chose, "AfficheBitmap (Ecran*);" est une fonction que l'utilisateur
va certainement appeler sans avoir appelé préalablement
"RecupereDonnees(SOCKET);".


Yep, c'est prévu. AfficheBitmap() est appelée quand Windows demande à
la fenêtre de s'afficher, et RecupereDonnees() est appelée quand des
octets arrivent depuis le réseau ; du point de vue de la classe, les
deux événements sont indépendants.

--
http://www.giromini.org/usenet-fr/repondre.html

1 2