C# 是否可以向集合中的类添加方法?
我试图在XNA中构建包含按钮和滑块的页面,并尝试了一些想法,但我似乎在保持“面向对象”和让按钮和滑块保持有用,而不增加实际的“按钮”和“滑块”类之间左右为难 所以我想知道是否有一种神奇的方法可以实例化一个Button类,然后添加一个方法,或者添加到一个方法的某种链接,这样我就可以迭代我的按钮或滑块集合,如果一个按钮被“点击”,执行与该按钮相关的特定方法 最好是在表示当时屏幕im绘图的父类中逐个编写方法 幻想代码示例:C# 是否可以向集合中的类添加方法?,c#,.net,xna,C#,.net,Xna,我试图在XNA中构建包含按钮和滑块的页面,并尝试了一些想法,但我似乎在保持“面向对象”和让按钮和滑块保持有用,而不增加实际的“按钮”和“滑块”类之间左右为难 所以我想知道是否有一种神奇的方法可以实例化一个Button类,然后添加一个方法,或者添加到一个方法的某种链接,这样我就可以迭代我的按钮或滑块集合,如果一个按钮被“点击”,执行与该按钮相关的特定方法 最好是在表示当时屏幕im绘图的父类中逐个编写方法 幻想代码示例: class Room // Example class to manipula
class Room // Example class to manipulate
{
public bool LightSwitch;
public void Leave() { /* Leave the room */ }
}
class Button
{ // Button workings in here
public bool GotPressed(/*click location */)
{ /* If click location inside Rect */ return true; }
public void magic() {} // the method that gets overidden
}
public class GameScreen
{
public Room myRoom;
private List<Button> myButtons;
public GameScreen()
{
myRoom = new Room();
myRoom.LightSwitch = false;
List<Button> myButtons = new List<Button>();
Button B = new Button();
// set the buttons rectangle, text etc
B.magic() == EscapeButton(B);
myButtons.Add(B);
Button B = new Button();
B.magic() == SwitchButton(B);
myButtons.Add(B);
}
public void Update() // Loop thru buttons to update the values they manipulate
{ foreach (Button B in myButtons)
{ if(B.GotPressed(/*click*/)) { B.magic(B) } }}
// Do the specific method for this button
static void EscapeButton(Button b)
{ myRoom.Leave(); }
static void SwitchButton(Button b)
{ myRoom.LightSwitch = true; }
}
教室//要操作的示例类
{
公共光开关;
公共无效离开(){/*离开房间*/}
}
类按钮
{//这里有按钮工作
公共bool已按下(/*单击位置*/)
{/*如果单击Rect内的位置*/返回true;}
public void magic(){}//被覆盖的方法
}
公共类游戏屏幕
{
公共房间我的房间;
私有列表按钮;
公共游戏屏幕()
{
myRoom=新房间();
myRoom.LightSwitch=false;
List myButtons=新建列表();
按钮B=新按钮();
//将按钮设置为矩形、文本等
B.magic()==逃逸按钮(B);
我的按钮。添加(B);
按钮B=新按钮();
B.magic()==开关按钮(B);
我的按钮。添加(B);
}
public void Update()//循环通过按钮来更新它们操作的值
{foreach(myButtons中的按钮B)
{if(B.GotPressed(/*click*/){B.magic(B)}}
//执行此按钮的特定方法
静态空隙释放按钮(按钮b)
{myRoom.Leave();}
静态无效开关按钮(按钮b)
{myRoom.LightSwitch=true;}
}
C#有扩展方法,可以满足您的需要
扩展方法是在某个静态类中使用特殊语法定义的。其中的一个例子可能是:
public static char GetLastChar(this string some)
{
return some[some.length - 1];
}
string a = "hello world";
char someChar = a.GetLastChar();
您可以在此处了解更多信息:
听起来ti解决了一个类似的问题,如果不是同样的问题。我想您正在寻找活动的代表。我建议在这里使用事件: 首先,创建一个公开活动,包括课堂上的所有内容,例如:
public delegate void ClickedHandler(object sender, EventArgs e);
public event ClickedHandler Clicked;
private void OnClidked()
{
if (Clicked != null)
{
Clicked(this, EventArgs.Empty);
}
}
然后,在button类中创建一个方法,用于检查是否单击了该按钮
public void CheckClick(Vector2 click)
{
if (/* [i am clicked] */)
{
OnClicked();
}
}
在按钮外,您可以订阅单击的事件,如下所示:
var b = new Button();
b.Clicked += new ClickedHandler(b_Clicked);
/* [...] */
private void b_Clicked(object sender, EventArgs e)
{
/** do whatever you want when the button was clicked **/
}
要查找有关事件的详细信息,请转到此处:。希望这能有所帮助。从我收集到的扩展(或添加)静态方法来看,我想做的是重写一个特定的方法,这样当我迭代集合并触发相同的方法时,它会执行不同的操作。阅读答案很重要。阅读Msdn链接,您会发现扩展方法的行为类似于实例方法。谢谢,很遗憾,演示文稿是office 2010,代码是针对studio 2010的(我使用express,它是免费的)。我非常确定您可以使用express构建库。看起来其他项目只是一个演示。您也应该能够使用Visual C#Express构建WPF项目。这就是我想要的。我只是还没有看到一个好的事件示例,msdn示例似乎增加了很多废话,模糊了更多的实际用途!非常感谢!