我有一个这样的课程。
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类。
答案 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 =(