Héritage picturebox c # pour jeu de cartes
-
07-07-2019 - |
Question
Je m'amuse à jouer à un jeu de cartes pour mon article Intro to OOP. Le jeu lui-même répond au cahier des charges, mais je le joue maintenant pour ma propre gratification et mon apprentissage.
J'ai une classe de carte qui contient et image, son rang et sa suite. Sur l'interface graphique, j'utilise des zones d'image pour afficher l'image stockée dans les cartes respectives (qui sont stockées dans un tableau de cartes de la classe de cartes), donc,
cardPictureBox1.Image = card1.show();
cardPictureBox2.Image = card2.show();
cardPictureBox3.Image = card3.show();
...
etc
Serait-il possible de faire en sorte que la classe de carte hérite du contrôle PictureBox de sorte que ce qui est affiché à l'écran est "réellement" une instance des cartes (plutôt qu'une boîte contenant la valeur de l’image) qui réduirait considérablement le nombre de cerceaux qu’il faudrait sauter pour obtenir les cartes avec d’autres informations pertinentes.
La solution
Au lieu d’avoir une classe Card, vous pouvez créer un UserControl (nommé Card ou ucCard ou autre) qui hérite de PictureBox (au lieu d’hériter de UserControl). Pour ce faire, la méthode la plus simple consiste à ajouter un contrôle UserControl avec le nom souhaité, puis à modifier la ligne supérieure dans le code de
.public partial class ucCard : UserControl
à
public partial class ucCard : PictureBox
Votre contrôle ucCard aura alors toutes les propriétés d’un PictureBox (y compris Image, où vous voudriez stocker le bitmap de la carte). Lorsque vous construisez votre projet, le compilateur affiche une ligne faisant référence à AutoScaleMode. Supprimez cette ligne et reconstruisez-la.
Vous pouvez ensuite ajouter les propriétés et méthodes supplémentaires requises par les cartes, telles que costume, rang et Bitmaps pour le recto et le verso de la carte (le verso peut être statique afin que toutes les cartes le partagent), et peut-être un Flip ( ) méthode pour basculer entre les images avant et arrière.
Pour ce qui est de la POO, la partie oubliée de la sainte Trinité semble être l’encapsulation. Dans ce cas, étant donné qu'une carte est un élément visuel de l'interface utilisateur avec laquelle l'utilisateur interagit, il est parfaitement logique de l'encapsuler en tant que UserControl. Comme vous l'avez déjà remarqué, cela simplifiera l'application et facilitera votre vie.
Autres conseils
Serait-il possible de faire la carte classe un hériter de la PictureBox contrôler ce qui est à l'écran est " effectivement " une instance de la carte calss (plutôt qu’une boîte contenant le valeur de l'image de celui-ci) qui dramatique réduire le nombre de cerceaux il faudrait sauter à travers atteindre les cartes autres informations pertinentes.
Oui, mais voudriez-vous? Non. Il associe votre logique métier et votre modèle à votre couche d'interface graphique.
Si vous écrivez un article sur la programmation orientée objet, vous devez encourager de bonnes habitudes de programmation et décourager les raccourcis. Il serait préférable pour vous de créer un fichier MVC rapide afin que votre interface graphique se mette à jour automatiquement chaque fois que vous modifiez votre modèle.