2010-11-23 5 views
1

Nehmen wir an, ich habe eine Schnittstelle IAutoTask und einige andere Klassen, die diese Schnittstelle implementieren, RegularTextAnswerTask, , JoinPairsTask usw. Jede dieser Klassen definiert eine EvaluateAnswer Methode, die einen int zurückgibt - aber der Parameter für die Methode ist unterschiedlich.Eine spezifische Designfrage mit Generics lösen: Korrekt in diesem Fall?

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

} 

Nun, wie sollte die Definition der Schnittstelle aussehen? Ich kam mit:

public interface IAutoTask<AnswerType> 
{ 

    int EvaluateAnswer(AnswerType answer); 

} 

Und die Implementierer wie folgt zu ändern:

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

    public void EvaluateAnswer(int[] answer) 
    { 

    } 

} 

usw.

Wollen Sie diesen Ansatz betrachten eine richtige sein?

+0

Mindestens zwei Dinge sind unklar - Namenskonvention (Warum Sie Suffix Typ verwenden ist dies ein Meta-Typ der Antwort, warum evalueting Sie dann , wie Sie den Antworttyp auswerten können). Und zweitens - ist unklar, warum Sie dort abstrakte Klasse brauchen. –

+0

Nun, es ist mein Verständnis, dass anstelle von AnswerType ein tatsächlicher Typ übergeben wird, daher der Name. (Es ist dasselbe wie es T. zu nennen. Oder liege ich falsch?) Und natürlich ist eine abstrakte Klasse unnötig, so wie sie jetzt ist (leer), aber sie ist Teil meines Designs und wird in naher Zukunft an Bedeutung gewinnen. – David

+0

Ich habe nicht einmal die Problembeschreibung verstanden ... –

Antwort

2

Ihre Vorgehensweise ist akzeptabel, aber die beste Designauswahl hängt auch davon ab, wie Sie die Verbraucher Ihrer Klasse (d. H. Diejenigen, die _____AnswerTask verwenden) davon erwarten, sie zu verwenden.

Naming conventions for Generic Type Parameters deuten auf eine leichte Änderung Ihrer Interface-Definition:?

public interface IAutoTask<TAnswer> 
{ 

    int EvaluateAnswer(TAnswer answer); 

} 
+0

Ich plane, eine 'Evaluator'-Klasse hinzuzufügen, die eine gegebene Liste von Antworten mit einer gegebenen Liste von Aufgaben vergleicht. "IAutoTask" -Implementierer sind in der Lage, Antworten auf sich selbst auszuwerten, daher ist ein "Test", der aus einer Anzahl von "IAutoTask" besteht, in der Lage, sich selbst auszuwerten. (Der Rückgabewert von 'EvaluateAnswer' stellt eine Anzahl von Punkten dar, die der Student erhalten hat, um diese Aufgabe zu beantworten.) Außerdem gibt es 'ITaskRenderer' eine GUI für die Aufgaben. Danke, dass Sie eine Verbesserung vorgeschlagen haben. – David

+0

Vielen Dank für Ihre Hilfe :). – David

Verwandte Themen