1

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

4 回答 4

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
于 2012-05-11T07:12:41.657 回答
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());
}
}
于 2012-05-11T07:14:55.430 回答
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());

Pattern 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 的地方传递复合任务。没有人会知道实际上有一堆任务。

于 2012-05-11T07:41:11.817 回答
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);
于 2012-05-11T07:11:08.963 回答