我可以在类中创建一个委托吗?该委托将被传递到构造函数中,但不将其公开

本文关键字:构造函数 创建 我可以 一个 | 更新日期: 2023-09-27 17:57:49

我有一个这样的类。

public class Step<T>
{
    public delegate void Act<T>();
    Act<T> _act;
    public Step(Act<T> action)
    {
        Contract.Requires(action != null);
        _act = action;
    }
    public void PerformStep()
    {
        _act.Invoke();
    }
}

我的问题如下。我希望这个类的构造函数能够接受具有您在类中看到的定义的委托。我不希望那个代表成为我班的公众成员。另一种选择是在类之外有一个公共委托,但除了这个类之外没有其他类需要它。有什么方法可以使委托私有化吗?

如果这种解决方案不可行,还有其他选择吗?这个步骤类只是要按顺序运行的委托的包装器。如果我可以有一个更通用的解决方案,就不需要签名。

编辑:更多信息需要澄清。

这个类的目的是允许用户做以下事情。

如果我有一辆普通车。这辆车将有像Drive、Stop、Turn等方法。使用这个Step类,该类的用户应该能够创建他们类的实例,然后执行以下操作。

Car c = new Car();
Step<Car> step1 = new Step<Car>(c.TurnLeft);
Step<Car> step2 = new Step<Car>(c.Drive);
Step<Car> step3 = new Step<Car>(c.TurnRight);
//add steps to a collection
c.AddNewRoutine(collection of steps);
c.RunRoutine(identify which routine);

这些步骤将被添加到数据结构中,以便按顺序执行。car类将包含一个可以容纳这些步骤组的数据结构。这样就可以创建任何类,并让用户为该类设置步骤,而无需类或主程序对行为进行硬编码。

完成。我需要step类保持原样。我只是不想允许以任何形式对该委托进行公共访问,因为唯一需要它的类是step类。

我可以在类中创建一个委托吗?该委托将被传递到构造函数中,但不将其公开

如果其他类需要使用委托,则需要将其公开。时期

您唯一真正的选择是添加一个构造函数,该构造函数接受其他类型的参数,然后构造函数可以将其转换为该委托类型。

您的示例使用了一个不接受参数且没有返回值的自定义委托。为此,System.Action可能是理想的。如果您的自定义委托需要提供返回值,请改用System.Func

http://msdn.microsoft.com/en-us/library/system.action.aspx

http://msdn.microsoft.com/en-us/library/bb534960.aspx

从你提供的样本来看,你想要的东西更像这样:

public class Step<T>
{
    Action _action;
    public Step(Action action)
    {
        Contract.Requires(action != null);
        _action = action;
    }
    public void PerformStep()
    {
        _action.Invoke();
    }
}

一起删除委托并使用Action:

private Action<T> _action;
public Step(Action<T> action)
{
   _action = action;
}

编辑:

你也可以有一个简单的System.Action没有类型参数

private Action _action;
public Step(Action action)
{
   _action = action;
}

但是在执行此操作时请记住:

var c = new Car();
var step1 = new Step(c.TurnLeft);

如果您将步骤1与实际实例c绑定,则无法将该步骤用于另一个实例:

var c2 = new Car(); //There's no way to call step1 on this =(