C#基类构造函数可选使用及子类Triangle实现的最佳实践咨询
优雅实现Triangle子类的方案
你的核心诉求是不修改Shape基类,同时让Triangle接收3个独立Point实例并复用基类的构造逻辑,这可以通过在Triangle构造函数中把3个Point打包成数组,直接调用Shape已有的构造函数来实现,完全不需要新增基类构造。
正确的Triangle实现代码
internal class Triangle : Shape { // 保留单独的顶点字段方便直接引用 public Point Point1 { get; } public Point Point2 { get; } public Point Point3 { get; } // 带color和filled参数的构造函数 public Triangle(Point point1, Point point2, Point point3, string color, bool filled) : base(new[] { point1, point2, point3 }, color, filled) { Point1 = point1; Point2 = point2; Point3 = point3; } // 不带color和filled的构造函数,复用基类默认值 public Triangle(Point point1, Point point2, Point point3) : base(new[] { point1, point2, point3 }) { Point1 = point1; Point2 = point2; Point3 = point3; } }
方案优势
- 完全复用基类逻辑:Shape中对Point数组长度的校验、color和filled的初始化逻辑都被完整复用,不需要重复编写,也不需要修改基类。
- 符合开闭原则:基类Shape不需要因为新增子类而修改,避免了对原有代码的侵入。
- 语义清晰:Triangle的构造函数直接接收三个顶点,符合三角形的语义,同时底层依然遵循Shape的抽象约定。
可选优化:避免冗余字段
如果不需要单独的Point1/Point2/Point3字段,可以直接通过基类的Points数组访问顶点,进一步简化代码:
internal class Triangle : Shape { public Point Point1 => Points[0]; public Point Point2 => Points[1]; public Point Point3 => Points[2]; public Triangle(Point point1, Point point2, Point point3, string color, bool filled) : base(new[] { point1, point2, point3 }, color, filled) { } public Triangle(Point point1, Point point2, Point point3) : base(new[] { point1, point2, point3 }) { } }
这样既满足了Triangle的需求,又最大化复用了现有基类的代码,是更优雅的面向对象实现方式。
内容的提问来源于stack exchange,提问作者Danylo Herasymov
相关产品推荐
相关产品推荐

