【问题标题】:C# Set Methods?C# 设置方法?
【发布时间】:2023-03-20 19:22:01
【问题描述】:

有没有办法为一个类设置不同的方法?那么这里的 preDraw 和 postDraw 方法对于类的不同实例有不同吗?

class Scene
{
    public string text;

    public void preDraw() { }
    public void postDraw() { }

    Button[] buttons;

    public Scene(string text)
    {

    }
}


static class Scenes
{
    public static Scene name = new Scene("What is your name?");
    public static Scene age = new Scene("How old are you?");
}

我可以在哪里设置与年龄的 preDraw 方法完全不同的名称的 preDraw 方法?

【问题讨论】:

标签: c# class methods


【解决方案1】:

您可以使用抽象方法创建Scene 和抽象类,然后让Scene 的每个实现都必须有自己的方法实现。

abstract class Scene
{
    public string text;

    public abstract void preDraw();
    public abstract void postDraw();

    Button[] buttons;

    public Scene(string text)
    {

    }
}

【讨论】:

    【解决方案2】:

    要处理这个问题,您应该使用继承。

    我也会使用虚方法,因为您可能希望它已经写在基类中。

    我建议你创建一个基类:

    public class Scene
    {
        public string text;
    
        public virtual void preDraw() { }
        public virtual void postDraw() { }
    
        protected Button[] buttons;
    
        public Scene(string text)
        {
    
        }
    }
    

    然后我会创建继承自 Scene 的类:

    public class NameScene : Scene
    {
        public override void preDraw() { }
        public override void postDraw() { }
    }
    

    public class AgeScene : Scene
    {
        public override void preDraw() { }
        public override void postDraw() { }
    }
    

    最后像这样使用它:

    static class Scenes
    {
        public static Scene name = new NameScene("What is your name?");
        public static Scene age = new AgeScene("How old are you?");
    }
    

    请注意,如果在继承类中,则无需进行代码修改,您可以跳过这些方法。

    【讨论】:

      【解决方案3】:

      除了我不确定这是否是好方法(您可能希望对使用多态性感兴趣)之外,如果您真的希望每个实例有不同的方法实现,您可以使用委托:

      class Scene
      {
          public string text;
      
          public Action PreDraw {get; set;}
          public Action PostDraw {get; set;}
      
      
          public Scene(string text, Action preDraw)
          {
              text = text;
              PreDraw = preDraw;
          }
      }
      
      
      static class Scenes
      {
          public static Scene name = new Scene("What is your name?", () => Console.WriteLine("PreDraw the name."));
          public static Scene age = new Scene("How old are you?", () => Console.WriteLine("PreDraw the age."));
      }
      

      【讨论】:

        【解决方案4】:

        您的最佳实践:您必须使用多态性 MSDN

        【讨论】:

          【解决方案5】:

          您的意思是您希望每个实例都有自己的方法吗?您可以使用委托来执行此操作。

          class Scene
          {
              public string text;
          
              public Action preDraw{get;set; }
              public Action postDraw{get;set; }
          
              Button[] buttons;
          
              public Scene(string text)
              {
          
              }
          }
          static class Scenes
          {
              public static Scene name = new Scene("What is your name?");
              name.preDraw=new Action(()=>{Console.WriteLine("preDraw by name");});
              name.postDraw=new Action(()=>{Console.WriteLine("postDrawby name");});
              public static Scene age = new Scene("How old are you?");
              age.preDraw=new Action(()=>{Console.WriteLine("preDraw by age");});
              age.postDraw=new Action(()=>{Console.WriteLine("postDrawby age");});
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-02-19
            • 2011-02-24
            • 1970-01-01
            • 1970-01-01
            • 2023-04-04
            • 2011-09-18
            • 2011-03-06
            • 1970-01-01
            相关资源
            最近更新 更多