OOP对象创建指南

时间:2017-06-26 11:56:11

标签: c# .net oop

假设有一个像这样的多边形类:

public class Polygon 
{
   Point[] _vertices;

   public class Polygon(Point[] vertices)
   {
       _vertices = vertices;
   }
}

要制作三角形,正方形,六边形,你宁愿:

  • 从Polygon继承你的Triangle,Square等提供的类 具体的构造函数并以编程方式生成点?
  • 添加一个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添加任何内容。

另外,在后一种情况下,是否有任何方便的命名约定?

还有其他方法我不知道吗?

感谢。

3 个答案:

答案 0 :(得分:3)

如果不知道使用这些类的上下文,这个问题就没有明确的答案,但是如果不需要更具体的类,我就不会创建它们。如果您向RedPolygon添加BlueSquare属性,则不会创建ColorPolygon

只要有广场独有的行为就可以创建子类 - 我可以想象一下,像点击测试这样的数学运算在广场上比在多边形上表现得更快 - 那就是正方形

答案 1 :(得分:2)

要遵守SOLID原则。我会使用继承来解决这个问题。

Open/Closed principle个州的实体应该开放进行扩展,但已关闭进行修改。因此,要获得另一种形状,您不需要触摸Polygon类。

如果有人想要添加Hexagon,他只需创建一个新的源文件,Hexagon继承自Polygon而不是修改现有的Polygon源,这将要求他访问您的源。修改现有源代码也会增加使用新代码引入错误的风险。虽然对于您的简单示例而言,仅仅创建新形状的风险并不大,但只要您想要添加一些特定于不同形状的计算,风险就会上升。

您可以与YAGNI原则争论,该原则声明如果不需要,您不应该实现某些功能。因此,如果您不需要考虑进一步扩展,则可以完全控制源和使用此源的所有程序,您也可以使用静态“工厂”方法使用其他解决方案。

有关更深入的讨论,请参阅this article

答案 2 :(得分:1)

如果不扩展Polygon,则添加Square,Triangle等特定类是没有意义的。

您的派生类不会向Polygon添加任何内容的声明可能表示“有A”而不是“IS A”关系。 正方形是一个多边形,但它有顶点。

那就是说,我不会把它们作为静态方法放在类中,除非你打算只服务于固定数量的多边形类型。由于存在无限多个多边形,您是否需要在需要添加新形状时编辑该类?

如果Polygon是一个基本对象,它应该保留为一个简单的基本对象,并留给工厂创建特定的。

再说一遍,这听起来更像是一个有点模棱两可的考试题目。故意是在事情变得模糊的那一点上。