【问题标题】:How do I pass methods (multiple methods) as parameters into an inherited void method or delegate in C#?如何将方法(多个方法)作为参数传递给继承的 void 方法或 C# 中的委托?
【发布时间】:2015-02-27 16:08:50
【问题描述】:

我想生成一个 void 方法,它将其他 void 方法作为参数,以便我可以根据具体情况单独调用它们。子类可以访问此方法,这些子类可以通过名称调用该函数,同时将 void 方法传递给它。

像这样:

public class parent_class
{
    ...
    protected void like_an_action_delegate (Action/void function_a(), Action/void function_b(), ...)
    {
        if (condition_1)
        {
            function_a();
        }
        else if (condition_2)
        {
            function_a();
        }
            ...
        }
    }
}

//新建脚本

public class child_class : parent_class
{
    Update ()
    {
        like_an_action_delegate (void_function_a(), void_function_b(), ...);
    }
    ...some void methods here...
}

这很重要,因为我希望能够继承一个函数,该函数将不同的功能映射到一组键(在键盘上),就像我在逐个案例中所说的那样。

编辑:感谢您向我介绍 params,我将学习并报告。

【问题讨论】:

  • 不带参数的void方法可以作为Action传递。
  • 你到底想做什么?只问是因为有了更多信息,我们可能能够提供更好或更完整的解决方案
  • 另外,需要注意的是,标准命名约定是参数的小写字母,方法、属性和类的大写字母

标签: c# unity3d


【解决方案1】:

您可以为此使用Params关键字,

 public void MyMethodAggregate(params Action[] actions)
 {
      actions[someInt]();
      //do other conditional stuff
 }

另一种选择可能是传递{ Keys , Action } 字典的映射

public void ProcessKeyPress(Dictionary<KeyPressEnum,Action> actionMap)
{
    actionMap[theInternalKeyVariableYouHave]( );
}

这可能是一种更有表现力的方式来展示你想要完成的事情

如果您尝试为每个子项执行此操作,如果您有一组通常使用的常用操作,则最好将它们传递给父对象构造函数,如果该 actionMap 不包含特定于按下的键,那么使用默认行为(可能对于按钮主要用于一件事的上下文设置很有用)

public abstract class GameControlRequestProcessor
{
    private readonly Dictionary<KeyPressEnum, Action> _actionMap;
    private KeyPressEnum _lastKeyPressed;
    protected GameControlRequestProcessor(Dictionary<KeyPressEnum,Action> actionMap)
    { 
      _actionMap = actionMap;
    }

    protected abstract void Update( );
    protected void ProcessKeyPress(Dictionary<KeyPressEnum,Action> actionMap)
    {
      if(!actionMap.HasKey(_keyLastPressed))
      {
          if(_actionMap.HasKey(_keyLastPressed)) 
             _actionMap[keyLastPressed]();
          else 
          {
             //do something in the default case
          }
      }
      else 
        actionMap[_lastKeyPressed]();
    }
}

【讨论】:

  • 我要感谢大家的回复,我只是脑洞大开,意识到我什至不需要委托将我的函数封装到一个调用中。我什至不需要参数,尽管它可以在将来帮助我。对不起大家。 ://
猜你喜欢
  • 1970-01-01
  • 2013-04-02
  • 2011-11-24
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2020-07-29
相关资源
最近更新 更多