肯定这不是最好的标题。我正在创建一个系统来产生数学问题。开发人员必须实现两个接口:如何维持两个班级之间的沟通?
Problem
:这包含需要生成问题的属性。Configuration
:这是生成Problem
的范围参数。
这些接口:
public abstract class Problem
{
}
public abstract class Configuration
{
}
这里是为BinaryProblem一个例子。
public class BinaryProblem : Problem
{
public decimal X { get; set; }
public decimal Y { get; set; }
public BinaryProblem(decimal x, decimal y)
{
this.X = x; // Number 1
this.Y = y; // Number 2
}
}
public class BinaryProblemConfiguration : Configuration
{
// Range for X
public int XMin { get; set; }
public int XMax { get; set; }
// Range for Y
public int YMin { get; set; }
public int YMax { get; set; }
public BinaryProblemConfiguration() { }
}
你能看到问题与配置之间的界限吗?我需要放置许多实现这两个接口的模块。
所以,我需要一种方法来生成它们。我想在创建一个抽象类,其中包含:
protected static Random
:几乎所有的配置需要一个随机的类来创建数字(即random.Next(X1, Y1);
)。而且必须是静态的,因为需要始终使用相同的种子创建数字。public abstract TProblem Generate(TConfiguration config); // where : TProblem : Problem, new(), TConfiguration : Configuration
和实施的每个问题类型这个抽象类。
我的问题是:这是一个开始解决这个解决方案的好方法,还是我必须做的其他解决方案?
编辑:我试图一个例子是:
这是我的抽象类,我的意思是我的想法是,当你实例化这个类,您所指定的通用值:
public interface IProblemFactory
{
Problem CreateProblem();
}
public abstract class ProblemBaseFactory<TProblem, TConfiguration> : IProblemFactory
where TProblem : Problem
where TConfiguration : Configuration
{
private const int SEED = 100;
protected TConfiguration _config;
protected static Random _random;
public ProblemBaseFactory(TConfiguration config)
{
_config = config;
if (_random == null) _random = new Random(SEED);
}
public void SetSeed(int newSeed)
{
_random = new Random(newSeed);
}
public Problem CreateProblem()
{
return CreateProblem(_config);
}
public abstract TProblem CreateProblem(TConfiguration config);
}
public class BinaryProblemFactory : ProblemBaseFactory<BinaryProblem, BinaryProblemConfiguration>
{
public override BinaryProblem CreateProblem(BinaryProblemConfiguration config)
{
var x = GenerateValueInRange(_config.Range1);
var y = GenerateValueInRange(_config.Range2);
return new BinaryProblem(x, y, Operators.Addition);
}
private decimal GenerateValueInRange(Range<int> range)
{
return _random.Next(range.MinValue, range.MaxValue);
}
}
Sorr,我不明白如何从'问题'和'配置'派生的类应该使用。你可以添加一个使用的例子吗? – MiMo 2012-03-24 00:51:50
为什么X,X1和Y1的范围以及Y,X2,Y2的范围。 Yech!使用XMin和XMax等。 – 2012-03-24 01:19:03
我已添加新信息:) – 2012-03-24 17:15:11