我可以在类中创建一个委托吗?该委托将被传递到构造函数中,但不将其公开
本文关键字:构造函数 创建 我可以 一个 | 更新日期: 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 =(