数组作为参数传递?

时间:2012-05-11 07:04:22

标签: c# interface

我正在学习如何使用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());
        }
    }

}

4 个答案:

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