假设有一个像这样的多边形类:
public class Polygon
{
Point[] _vertices;
public class Polygon(Point[] vertices)
{
_vertices = vertices;
}
}
要制作三角形,正方形,六边形,你宁愿:
CreateSquare
静态方法,该方法返回一个可以使用的Polygon类?此:
public class Square : Polygon
{
public class Polygon(double size)
{
_vertices = new Point[]{ new Point(0,0), new Point(size,0), new Point(size,size), new Point(0,size)};
}
}
或者这个:
public class Polygon
{
Point[] _vertices;
public class Polygon(Point[] vertices)
{
_vertices = vertices;
}
public static Polygon CreateSquare(double size)
{
double verts = new Point[]{ new Point(0,0), new Point(size,0), new Point(size,size), new Point(0,size)};
return new Polygon(verts);
}
}
从OOP编程的角度来看,哪种方法更正确?请注意,派生类不会向原始Polygon添加任何内容。
另外,在后一种情况下,是否有任何方便的命名约定?
还有其他方法我不知道吗?
感谢。
答案 0 :(得分:3)
如果不知道使用这些类的上下文,这个问题就没有明确的答案,但是如果不需要更具体的类,我就不会创建它们。如果您向RedPolygon
添加BlueSquare
属性,则不会创建Color
或Polygon
。
只要有广场独有的行为就可以创建子类 - 我可以想象一下,像点击测试这样的数学运算在广场上比在多边形上表现得更快 - 那就是正方形
答案 1 :(得分:2)
要遵守SOLID原则。我会使用继承来解决这个问题。
Open/Closed principle个州的实体应该开放进行扩展,但已关闭进行修改。因此,要获得另一种形状,您不需要触摸Polygon类。
如果有人想要添加Hexagon,他只需创建一个新的源文件,Hexagon继承自Polygon而不是修改现有的Polygon源,这将要求他访问您的源。修改现有源代码也会增加使用新代码引入错误的风险。虽然对于您的简单示例而言,仅仅创建新形状的风险并不大,但只要您想要添加一些特定于不同形状的计算,风险就会上升。
您可以与YAGNI原则争论,该原则声明如果不需要,您不应该实现某些功能。因此,如果您不需要考虑进一步扩展,则可以完全控制源和使用此源的所有程序,您也可以使用静态“工厂”方法使用其他解决方案。
有关更深入的讨论,请参阅this article
答案 2 :(得分:1)
如果不扩展Polygon,则添加Square,Triangle等特定类是没有意义的。
您的派生类不会向Polygon添加任何内容的声明可能表示“有A”而不是“IS A”关系。 正方形是一个多边形,但它有顶点。
那就是说,我不会把它们作为静态方法放在类中,除非你打算只服务于固定数量的多边形类型。由于存在无限多个多边形,您是否需要在需要添加新形状时编辑该类?
如果Polygon是一个基本对象,它应该保留为一个简单的基本对象,并留给工厂创建特定的。
再说一遍,这听起来更像是一个有点模棱两可的考试题目。故意是在事情变得模糊的那一点上。