Я новичок в создании классов диаграмм. Необходимость обязывает меня сделать хорошую модель.
Решение для математической викторины. Система должна генерировать каждую проблему и проверять ответ.
Я собираюсь показать мои общие классы:
Здесь есть сундуки
interface IProblemFactory<T> where T : Problem<T>
{
T Create();
}
public class ArithmeticProblemFactory : IProblemFactory<Arithmetic>
{
// This generates Arithmetic problems
public Arithmetic Create() { }
}
// And the others types of problems
Тогда у меня есть классы, которые содержат проблему:
public abstract class Problem<T> : IEquatable<T>
{
public abstract int ResultCount { get; }
public abstract bool CheckTheAnswer();
protected abstract bool CheckTheAnswer(params object[] results);
public abstract bool Equals(T other);
}
public class Arithmetic : Problem<Arithmetic>
{
public decimal Number1 { get; set; }
public Operations Operation { get; set; }
public decimal Number2 { get; set; }
public override int ResultCount
{
get { return 1; }
}
protected override bool CheckTheAnswer(params object[] results)
{
if (results.Length != ResultCount)
throw new ArgumentException("Only expected " + ResultCount + " arguments.");
decimal result = (decimal)results[0];
switch (Operation)
{
case Operations.Addition:
return Number1 + Number2 == result;
case Operations.Subtraction:
return Number1 - Number2 == result;
case Operations.Multiplication:
return Number1 * Number2 == result;
case Operations.Division:
return Number1 / Number2 == result;
default:
throw new Exception("Operator unexpected");
}
}
public override bool Equals(Arithmetic other)
{
if (other == null)
return false;
return this.Number1 == other.Number1 && Number2 == other.Number2;
}
}
Проблема, я думаю, я не делаю хорошего дизайна. Потому что все проблемы будут содержать CheckTheAnswer (params obj ..). Но все проблемы имеют разные результаты.
Например, в Арифметике необходимо только десятичное значение, для сравнения 2 мне нужно сохранить два значения, другие мне нужно сохранить результат как класс дроби.
Может быть, мне нужно разделить их .. Арифметика может содержать только два свойства: проблему и ответ, но я не уверен.