Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以向集合中的类添加方法?_C#_.net_Xna - Fatal编程技术网

C# 是否可以向集合中的类添加方法?

C# 是否可以向集合中的类添加方法?,c#,.net,xna,C#,.net,Xna,我试图在XNA中构建包含按钮和滑块的页面,并尝试了一些想法,但我似乎在保持“面向对象”和让按钮和滑块保持有用,而不增加实际的“按钮”和“滑块”类之间左右为难 所以我想知道是否有一种神奇的方法可以实例化一个Button类,然后添加一个方法,或者添加到一个方法的某种链接,这样我就可以迭代我的按钮或滑块集合,如果一个按钮被“点击”,执行与该按钮相关的特定方法 最好是在表示当时屏幕im绘图的父类中逐个编写方法 幻想代码示例: class Room // Example class to manipula

我试图在XNA中构建包含按钮和滑块的页面,并尝试了一些想法,但我似乎在保持“面向对象”和让按钮和滑块保持有用,而不增加实际的“按钮”和“滑块”类之间左右为难

所以我想知道是否有一种神奇的方法可以实例化一个Button类,然后添加一个方法,或者添加到一个方法的某种链接,这样我就可以迭代我的按钮或滑块集合,如果一个按钮被“点击”,执行与该按钮相关的特定方法

最好是在表示当时屏幕im绘图的父类中逐个编写方法

幻想代码示例:

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示例似乎增加了很多废话,模糊了更多的实际用途!非常感谢!