我有一个简单的程序,基于用户提供的鼠标数据来绘制几何图形。我有一个处理鼠标跟踪的类(它获取带有鼠标移动历史记录的列表),还有一个名为Shape的抽象类。从这个类中,我派生出一些额外的形状,如圆形、矩形等——每个形状都重写了抽象的Draw()函数。
一切都很好,但问题在于当我希望用户能够手动切换所需的形状时。我获取鼠标数据并知道应该绘制哪种形状。问题是如何让代码“知道”应该创建哪个对象并传递适当的参数给构造函数。此时添加新的形状派生类也是不可能的,这显然是错误的。
显然,我不想编写以下代码:
上面的代码明显违反了开闭原则。问题在于我没有任何好的想法来解决它。主要问题是不同的形状具有不同参数的构造函数,这使得它变得更加棘手。
我相信这是一个常见的问题,但我不知道如何克服它。你有什么想法吗?
一切都很好,但问题在于当我希望用户能够手动切换所需的形状时。我获取鼠标数据并知道应该绘制哪种形状。问题是如何让代码“知道”应该创建哪个对象并传递适当的参数给构造函数。此时添加新的形状派生类也是不可能的,这显然是错误的。
显然,我不想编写以下代码:
List<Shape> Shapes = new List<Shape>();
// somwhere later
if(CurrentShape == "polyline"){
Shapes.Add(new Polyline(Points));
}
else if (CurrentShape == "rectangle"){
Shapes.Add(new Rectangle(BeginPoint, EndPoint));
}
// and so on.
上面的代码明显违反了开闭原则。问题在于我没有任何好的想法来解决它。主要问题是不同的形状具有不同参数的构造函数,这使得它变得更加棘手。
我相信这是一个常见的问题,但我不知道如何克服它。你有什么想法吗?
Shape(IEnumerable<Point> points)
。矩形重载只需要检查是否提供了两个点。实际上,dasblinkenlight 在他的答案中提供了相同的想法。 - Simon Mourier