You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 13:57:18