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?
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. –
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
Ich habe nicht einmal die Problembeschreibung verstanden ... –