我正在学习如何使用C#接口, 我读这个顽皮: http://www.codeproject.com/Articles/286863/I-Interface
其中一个例子:
public class TaskComposite : ITask
{
public TaskComposite(params ITask[] tasks)
{
this.composedTasks = new List<ITask>();
if(tasks != null)
{
foreach(var task in tasks)
AddTask(task);
}
}
public void Do()
{
foreach(var task in this.composedTasks)
task.Do();
}
public void AddTask(ITask task)
{
if(task != null)
this.composedTasks.Add(task);
}
private List<ITask> composedTasks;
}
描述说:
我们可以将一大堆任务组合在一起以便连续执行。
我创建一个Windows窗体作为创建TaskComposite类的新实例,但接下来该怎么办?
public partial class FormInterface : Form
{
public FormInterface()
{
InitializeComponent();
}
private void FormInterface_Load(object sender, EventArgs e)
{
ITask[] TaskAry = new ITask[] { };
TaskAry[0] = new TaskClass().Do(); //<=Error
TaskComposite tc = new TaskComposite(TaskAry);
}
class TaskClass : ITask
{
public void Do()
{
Console.WriteLine(DateTime.Now.ToString());
}
}
}
答案 0 :(得分:2)
初始化数组,方法Do
返回void
// wrong
ITask[] TaskAry = new ITask[] { };
TaskAry[0] = new TaskClass().Do();
// correct
ITask[] TaskAry = new ITask[] { new TaskClass() };
TaskAry[0].Do();
// better
// TaskComposite constructor accepts param array
TaskComposite tc = new TaskComposite(new TaskClass());
tc.Do(); // execute passed instance of TaskClass
答案 1 :(得分:2)
宁可做这样的事: -
private void FormInterface_Load(object sender, EventArgs e)
{
ITask[] TaskAry = new[]{ new TaskClass() };
TaskComposite tc = new TaskComposite(TaskAry);
tc.Do(); //This Will Start Your Task, In Case you Want To Start It Here.
}
class TaskClass : ITask
{
public void Do()
{
Console.WriteLine(DateTime.Now.ToString());
}
}
答案 2 :(得分:2)
你有几个错误。
首先,在创建数组时,应指定其大小或初始化它。这是集合(具有可变大小)和数组之间的差异。所以,你应该提供尺寸
ITask[] TaskAry = new ITask[1];
TaskAry[0] = new TaskClass();
或初始化(大小将由编译器计算):
ITask[] TaskAry = new ITask[] { new TaskClass() };
但在您的情况下,当使用params ITask[] tasks
时,您只需传递任务列表:
TaskComposite tc = new TaskComposite(new TaskClass());
模式Composite允许您将对象组视为单个对象。在您的案例中,复合任务允许您将多个任务视为一个任务对象。因此,如果没有复合任务,您将需要使用任务的数组/集合并手动执行每个任务。像这样:
ITask[] tasks = new ITask[] { new TaskClass(), new TaskClass() };
foreach(ITask task in tasks)
task.Do();
使用复合任务,您无需迭代所有任务:
ITask compositeTask = new TaskComposite(new TaskClass(), new TaskClass());
compositeTask.Do(); // executes all tasks
您可以在需要简单ITask的地方传递复合任务。没有人会知道实际上有很多任务。
答案 3 :(得分:1)
因为您没有在
中指定尺寸 ITask[] TaskAry = new ITask[10]; //Specify the size or specify a value in {}
TaskAry[0] = new TaskClass(); //Also this interface may hold an object of TaskClass
TaskComposite tc = new TaskComposite(TaskAry);