我一直想知道如何让一个物体在不同情况下采取不同的行动
澄清我在想什么:
我想制作一个菜单系统,我想要一个“按钮”类。但按钮应该根据它的按钮类型而有所不同。
一个按钮可以关闭程序,另一个可以开始游戏,第三个可以进入设置。
(我考虑将方法解析为参数,但是你仍然需要在代码中的某处编写很多不同的方法)
你如何在考虑OOP的情况下做到这一点?我可以使用枚举和开关来硬编码简单菜单的基本功能,但我想知道是否可以避免。 我想避免像代表这样的事情,因为游戏不是以这种方式基于事件的,还有切换案例,大的if / else语句因为它们真的很难看。
有没有办法让对象表现得像这样?
制作菜单的其他替代方法是什么,试图避免常用枚举的切换案例。 (不禁用枚举)
答案 0 :(得分:2)
我想避免像代表这样的事情,因为游戏不是以这种方式基于事件
不是吗?无论是游戏还是网络应用程序,点击按钮都是一个事件。根据定义,您想要做出反应的事情,例如按下按钮。单击按钮时发生的情况应该与UI中的按钮松散耦合,原因是您已经遇到的原因(大型开关/ if-elses是一种痛苦)等等。对于这个特殊情况,C#event
字段看起来非常合适。
在某些时候,你会以某种方式在某处创建设置按钮。为什么不在那里接线?有点像:
class Button
{
public Button(string label) {}
public event Action Clicked;
}
class Program
{
public static void Main(string[] args)
{
var settingsButton = new Button("Settings");
settingsButton.Clicked += () =>
{
// open settings view
};
}
}
我会为这个问题避免继承,因为它会因为错误的原因而增加不必要的复杂性。如果覆盖类改变或补充它所扩展的类的行为,你应该(可能)使用继承(逻辑进展object
扩展Component
扩展Button
扩展ToggleButton
1}})但不要创建一个与构建UI的方式密切相关的类层次结构。如果您更改设置,则可以访问下拉菜单而不是按下按钮,您不希望被绑定到SettingsButton
类;您希望能够简单地更改哪个事件触发了所需的行为,在这种情况下,请下拉下拉菜单。