我正在创建一个自定义控件,它是一个按钮。它可能有一个类型和一个根据其类型指定的图像。其类型可以是:

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枚举中,而不更改这个方法。
如何实现此方法以与将来的更改兼容?

最佳答案

您可以做的一件事是将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方法。
由于此方法位于自定义按钮类上,因此我可能会更进一步,并将样式/外观封装到类中:
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基类以类似的方式设置按钮行为(即单击按钮时执行的操作),并在您想要更改按钮的用途和样式时指定特定操作(如停止和播放)。

09-04 02:47