herencia de c # picturebox para juego de cartas
-
07-07-2019 - |
Pregunta
Estoy trabajando en un juego de cartas para mi introducción al papel OOP. El juego en sí cumple con las especificaciones, pero ahora estoy jugando con él para mi propia satisfacción y aprendizaje.
Tengo una clase de tarjeta que contiene una imagen, su rango y suite. En la GUI, uso cuadros de imagen para mostrar la imagen almacenada en las tarjetas respectivas (que se almacenan en una matriz de tarjetas en la clase de mazo), entonces,
cardPictureBox1.Image = card1.show();
cardPictureBox2.Image = card2.show();
cardPictureBox3.Image = card3.show();
...
etc
¿Sería posible hacer que la clase de tarjeta herede el control PictureBox, de modo que lo que está en pantalla es "en realidad"? una instancia del calss de la tarjeta (en lugar de un cuadro que contenga el valor de la imagen) que reduciría drásticamente la cantidad de aros por los que uno tendría que saltar para obtener otra información relevante de las tarjetas.
Solución
En lugar de tener una clase Card, puede crear un UserControl (denominado Card o ucCard o lo que sea) que herede de PictureBox (en lugar de heredar de UserControl). La forma más fácil de hacer esto en C # es agregar un UserControl con su nombre deseado y luego, en el código, cambiar la línea superior de
public partial class ucCard : UserControl
a
public partial class ucCard : PictureBox
Su control ucCard tendrá todas las propiedades de un PictureBox (incluida la imagen, donde almacenaría el mapa de bits de la tarjeta). Cuando compila su proyecto, el compilador vomitará en una línea que hace referencia a AutoScaleMode; simplemente elimine esta línea y vuelva a generarla.
A continuación, puede agregar cualquier propiedad y método adicional que requieran las tarjetas, como palo y rango y mapas de bits para el frente y el reverso de la tarjeta (el reverso podría ser estático para que todas las cartas lo compartan), y tal vez un Volteo ( ) método para cambiar entre las imágenes frontal y posterior.
En lo que respecta a OOP, la parte olvidada de la santa trinidad parece ser la Encapsulación. En este caso, dado que una tarjeta es un elemento visual en la interfaz de usuario con el que interactúa el usuario, tiene mucho sentido encapsularla como UserControl. Como ya has notado, esto hará que la aplicación sea más simple y tu vida más fácil.
Otros consejos
¿Sería posible hacer la tarjeta clase y hereda el PictureBox controlar así que lo que está en pantalla es " en realidad " una instancia de la tarjeta calss (en lugar de una caja que contiene el valor de la imagen de la misma) que lo haría dramaticall reduce la cantidad de aros uno tendría que saltar a obtener las tarjetas otra información relevante.
Sí, pero ¿quieres? No. Combina la lógica y el modelo de su negocio muy estrechamente con su capa de GUI.
Si está escribiendo un artículo sobre OOP, debe fomentar los buenos hábitos de programación y desalentar los recortes. Sería mejor para usted crear un MVC rápido, para que su GUI se actualice automáticamente cada vez que realice un cambio en su modelo.