Вопрос

Я играю в карточную игру для моего вступления к статье об ООП.Сама игра соответствует спецификациям, но сейчас я играю с ней для собственного удовольствия и обучения.

У меня есть класс карты, который содержит изображение, его ранг и набор.В графическом интерфейсе я использую графические поля для отображения изображения, хранящегося на соответствующих картах (которые хранятся в массиве карт в классе deck), поэтому,

cardPictureBox1.Image = card1.show();
cardPictureBox2.Image = card2.show();
cardPictureBox3.Image = card3.show();
...
etc

Можно ли было бы сделать класс card наследующим элемент управления PictureBox, чтобы то, что отображается на экране, было "на самом деле" экземпляром card calss (а не полем, содержащим его значение изображения), что значительно уменьшило бы количество обручей, через которые нужно было бы перепрыгнуть, чтобы получить другую релевантную информацию о картах.

Это было полезно?

Решение

Вместо того, чтобы иметь класс Card, вы можете создать UserControl (с именем Card или ucCard или что-то еще), который наследуется от PictureBox (вместо наследования от UserControl).Самый простой способ сделать это на C # - добавить UserControl с желаемым именем, а затем в коде изменить верхнюю строку с

public partial class ucCard : UserControl

Для

public partial class ucCard : PictureBox

После этого ваш элемент управления ucCard будет обладать всеми свойствами PictureBox (включая Image, где вы будете хранить растровое изображение карты).Когда вы создаете свой проект, компилятор выдаст ошибку в строке, которая ссылается на AutoScaleMode - просто удалите эту строку и перестройте заново.

Затем вы можете добавить любые дополнительные свойства и методы, необходимые картам, такие как масть и ранг, а также растровые изображения для лицевой и оборотной сторон карты (оборотная сторона может быть статичной, чтобы все карты могли использовать ее совместно), и, возможно, метод Flip () для переключения между передним и оборотным изображениями.

Что касается ООП, то забытой частью святой троицы, по-видимому, является Инкапсуляция.В этом случае, поскольку card является визуальным элементом пользовательского интерфейса, с которым взаимодействует пользователь, имеет смысл инкапсулировать его как UserControl.Как вы уже заметили, это упростит приложение и вашу жизнь.

Другие советы

  

Можно ли сделать карту   класс наследовать PictureBox   контролировать, так что на экране   & Quot; фактически & Quot; экземпляр карты   Calss (а не коробка, которая содержит   значение этого изображения), который будет   значительно сократить количество обручей   нужно было бы прыгнуть до   получить карты другую соответствующую информацию.

Да, но вы бы хотели? Нет. Он очень тесно связывает вашу бизнес-логику и модель с вашим графическим интерфейсом.

Если вы пишете статью о ООП, вы должны поощрять хорошие привычки программирования и избегать срезания углов. Было бы лучше, если бы вы взбили быструю MVC, чтобы ваш графический интерфейс автоматически обновлялся каждый раз, когда вы вносите изменения в вашу модель.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top