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

时间:2013-02-04 16:32:31

标签: c# generics delegates

我有一个这样的课程。

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 Class,Class的用户应该能够创建他们类的实例,然后执行以下操作。

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类。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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();
    }
}

答案 2 :(得分: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 =(