0

我有这样的课。

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();
    }
}

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

如果该解决方案不可行,是否有替代方案?此步骤类只是要按顺序运行的委托的包装器。如果我可以有更通用的解决方案,则无需签名。

编辑:更多信息以供澄清。

此类的目的是能够允许用户执行以下操作。

如果我有一辆Class Car。这辆车将具有 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);

这些步骤将被添加到允许它们按顺序执行的数据结构中。汽车类将包含一个可以保存这些步骤组的数据结构。然后,这允许创建任何类并让用户设置该类要采取的步骤,而无需类或主程序对行为进行硬编码。

完成。我需要步骤类保持原样。我只是不想允许以任何形式公开访问该委托,因为唯一需要它的类是 Step 类。

4

3 回答 3

2

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

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

于 2013-02-04T16:35:40.310 回答
2

您的示例使用不带参数且没有返回值的自定义委托。为此,这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();
    }
}
于 2013-02-04T16:38:57.277 回答
1

一起移除委托并使用一个动作:

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);

您将step1 绑定到实际实例c,您将无法将该步骤重用于另一个实例:

var c2 = new Car(); //There's no way to call step1 on this =(
于 2013-02-04T16:36:39.273 回答