2010-11-23 14 views
1

のは、私がなどのインターフェースIAutoTask、そのインターフェイスを実装するいくつかの他のクラス、RegularTextAnswerTaskSelectAnswerTaskJoinPairsTaskを持っているとしましょうこれらの各クラスには、int型を返すEvaluateAnswer方法を定義して - しかし、メソッドのパラメータが異なります。ジェネリックを使用して特定の設計問題を解決する:この場合は正しい?

public sealed class SelectAnswerTask : IAutoTask 
{ 

    public int EvaluateAnswer(int[] answer); 

} 

public sealed class RegularTextAnswerTask : IAutoTask 
{ 

    public int EvaluateAnswer(string answer); 

} 

public sealed class JoinPairsTask : IAutoTask 
{ 

    public int EvaluateAnswer(int[,] answer); 

} 

ここで、インターフェイスの定義はどのようになっていますか?私が思い付いた:

public interface IAutoTask<AnswerType> 
{ 

    int EvaluateAnswer(AnswerType answer); 

} 

、次のように実装を変更する:

public sealed class SelectAnswerTask : IAutoTask<int[]> 
{ 

    public void EvaluateAnswer(int[] answer) 
    { 

    } 

} 

など

あなたは、このアプローチが正しいものであると考えていますか?

+0

少なくとも二つのことは不明である - そして、なぜあなたはそれをevalueting大会(サフィックスの種類を使用する理由、これが答えのメタタイプである名前を付けます? 、回答のタイプを評価する方法)。そして2番目のことは、そこに抽象クラスが必要な理由は不明です。 –

+0

AnswerTypeの代わりに実際の型が渡されることは私の理解です。 (それはTと呼ぶのと同じですか、間違っていますか?)もちろん、抽象クラスは今のところ空ではありませんが、私の設計の一部であり、近い将来重要性を増します。 – David

+0

私は問題の説明を理解していませんでした... –

答えて

2

あなたのアプローチは受け入れられますが、最良のデザイン選択は、あなたのクラスの消費者(つまり、_____AnswerTaskを使用している消費者)がそれを使用すると思われる方法によっても異なります。

Naming conventions for Generic Type Parametersは、あなたのインターフェイス定義に若干の変更を提案:

public interface IAutoTask<TAnswer> 
{ 

    int EvaluateAnswer(TAnswer answer); 

} 
+0

私は与えられたタスクのリストに対して回答のリストと一致する 'Evaluator'クラスを追加するつもりです。 'IAutoTask'の実装者は自分自身への回答を評価することができるので、' IAutoTask'からなる 'Test'はそれ自身を評価することができます。 ( 'EvaluateAnswer'の戻り値は、学生がそのタスクに応答した点の数を表しています)さらに、タスク用のGUIを構築する' ITaskRenderer'もあります。改善を提案していただきありがとうございます。 – David

+0

ありがとうございました:)。 – David

関連する問題