#c# #winforms #coding-style #methods
#c# #winforms #стиль кодирования #методы
Вопрос:
Я создаю пользовательский элемент управления, и это кнопка. Он может иметь тип и указанное изображение в соответствии с его типом. Его тип может быть:
public enum ButtonType
{
PAUSE,
PLAY
}
Теперь я могу изменить его внешний вид и изображение с помощью метода:
public ButtonType buttonType;
public void ChangeButtonType(ButtonType type)
{
// change button image
if (type == ButtonType.PAUSE)
button1.Image = CustomButtonLibrary.Properties.Resources.PauseButton;
else if (type == ButtonType.PLAY)
button1.Image = CustomButtonLibrary.Properties.Resources.PlayButton;
buttonType = type;
}
Хорошо, этот метод не кажется таким уж хорошим, например, может быть, позже я захочу иметь другой тип STOP
, например, для этой кнопки, я хочу просто добавить ее изображение в ресурсы и добавить его в ButtonType
enum, не меняя этот метод.
Как я могу реализовать этот метод, чтобы он был совместим с будущими изменениями?
Комментарии:
1. Где
ChangeButtonType
метод? Это на вашей пользовательской кнопке?2. @Anna: да, это библиотека элементов управления, и этот метод, и это перечисление, и все это есть.
Ответ №1:
Одна вещь, которую вы можете сделать, это превратиться ButtonType
в базовый класс (или интерфейс, если хотите):
public abstract class ButtonType
{
public abstract Image GetImage();
}
Затем каждый из ваших типов становится подклассом:
public class PauseButtonType : ButtonType
{
public Image GetImage()
{
return CustomButtonLibrary.Properties.Resources.PauseButton;
}
}
public class PlayButtonType : ButtonType
{
public Image GetImage()
{
return CustomButtonLibrary.Properties.Resources.PlayButton;
}
}
Затем ваш метод изменения изображения становится:
private ButtonType buttonType; // public variables usually aren't a good idea
public void ChangeButtonType(ButtonType type)
{
button1.Image = type.GetImage();
buttonType = type;
}
Таким образом, когда вы хотите добавить другой тип, вы добавляете другой подкласс buttonType и передаете его своему ChangeButtonType
методу.
Поскольку этот метод относится к вашему пользовательскому классу button, я бы, вероятно, пошел немного дальше и инкапсулировал стиль / внешний вид в классе:
public class ButtonStyle
{
// might have other, non-abstract properties like standard width, height, color
public abstract Image GetImage();
}
// similar subclasses to above
А затем на самой кнопке:
public void SetStyle(ButtonStyle style)
{
this.Image = style.GetImage();
// other properties, if needed
}
Вы можете настроить поведение кнопок (т. Е. Действия, Которые они выполняют при нажатии) аналогичным образом с базовым классом ButtonAction и назначить конкретные действия, такие как остановка и воспроизведение, когда вы хотите изменить назначение и стиль кнопки.
Ответ №2:
Не знаю, лучший ли это вариант, но вы можете создать пользовательское свойство для своего перечисления, содержащее изображение
public enum ButtonType
{
[ButtonImage(CustomButtonLibrary.Properties.Resources.PauseButton)]
PAUSE,
[ButtonImage(CustomButtonLibrary.Properties.Resources.PlayButton)]
PLAY
}
Я не буду вдаваться в подробности об этом, так как это легко найти в Google… На самом деле, это хороший ресурс для начала: