2012-05-11 91 views
1

我正在學習如何使用C#接口, 我讀這artcile: 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()); 
     } 
    } 

} 

回答

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預期。沒有人會知道實際上有一堆任務。

+0

感謝您的詳細解答! – Cheung

+0

@SilverNight沒有問題:)順便說一句,你在winforms應用程序中使用控制檯。默認情況下,你不會看到任何TaskClass的輸出。 –

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); 
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 
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()); 
} 
}