2017-05-01 21 views
-1

私はこのようになりますタスクと呼ばれる基本クラスがあります。機能の実装

public class Task{ 
    List<Task> subTasks = new List<Task>(); 
    public T executeTask<T>(){ 
     foreach(Task tsk in subTasks){ 
      tsk.executeTask(); 
     } 
    } 
} 

をそして私はそうでTaskA、TaskBなどTaskクラスから継承する他のいくつかのタスクを持っています。それらはすべてexecuteTaskの独自の実装を持つ必要があります。

私が直面している問題は、タスクの中には計算をしているものもあれば、たとえば文字列操作を実行して操作の結果を返すものもあります。つまり、戻り値の型は柔軟でなければならない巨大な鋳造量。

これを実装する方法については、誰かがきれいでいいアイデアを持っていますか?

+8

タスクという名前のクラスを持っていることは非常に素晴らしい考えではありません(そして、あなたはホイールを再開発していないと確信していますか?[クラスタスク](https://msdn.microsoft.com/en-us/library/system)。 – Steve

+5

スティーブがコメントを書いた理由がわからない場合は、C#の非同期実行処理の中心的な役割を果たすクラスへの参照があります。['threading.tasks.task(v = vs.110).aspx)タスク '](https://msdn.microsoft.com/en-us/library/system.threading.tasks.task%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396)。 – dasblinkenlight

+0

名前はありませんタスクは単なる例でした。それは実際に問題に影響しない、それ以上のものを持つ別のクラスです。 – Curunir

答えて

0

..戻り値の型が柔軟でなければならないことを意味します。 - 継承が役立たないことを意味します。継承メソッドでは、 "signature"は同じでなければなりません。

一般的な返された型を導入し、それをメソッドの署名に使用することができます。

public class Result 
{ 
    public object Value {get; set;} 
} 

public interface IYourTask 
{ 
    Result Execute(); 
} 

public class StringManipulationTask 
{ 
    public Result Execute() 
    { 
     // do something 
     return new Result("resultofManipulation"); 
    } 
} 

public class NoReturnDataTask 
{ 
    public Result Execute() 
    { 
     // do something 
     return new Result(); // with no data - "empty result" 
    } 
} 

「結果」の振る舞いに基づいて、あなたは抽象化としてResultを紹介し、さまざまな行動のための独自の実装を持つことができます。

要約 - すべてのタスクを同じ「一般的な」方法で使用する場合は、すべてのタスクを同じ書式/署名でラップする必要があります。

+0

私はいくつかの結果、私の悪いを返信しないと言うことを忘れていた。 – Curunir

+0

@Curunir、タスクが返ってこない場合は、「空の」結果を返すことができます – Fabio

関連する問題