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

修改Circle类的Radius属性后如何同步更新Circumference属性

问题原因

当前Circumference属性仅在Circle类构造时计算一次,后续修改Radius属性时没有触发周长的重新计算逻辑,因此会出现后续两条断言失败的问题。同时你的代码没有对Radius的负值输入做全局校验,仅在构造函数中处理了负值场景,直接给Radius赋负数时会直接存储负数,也不符合你的测试预期。

解决方案

推荐两种实现方式,你可以按需选择:

方案1:使用计算属性实现(推荐,实现最简单,适合当前轻量计算场景)

将Circumference改为动态计算的只读属性,每次读取时基于当前Radius实时计算结果,同时给Radius属性增加负值校验逻辑,修改后的完整Circle类代码如下:

public class Circle
{
    public double X { get; set; }
    public double Y { get; set; }
    
    // 给Radius增加负值校验,设值小于0时自动存0
    private double _radius;
    public double Radius
    {
        get => _radius;
        set => _radius = value < 0 ? 0 : value;
    }
    
    // 动态计算周长,每次读取时基于最新Radius计算结果
    public double Circumference => _radius * 2 * Math.PI;

    public Circle(double x, double y, double radius)
    {
        X = x;
        Y = y;
        Radius = radius; // 直接赋值即可,setter会自动处理负值
    }
}

方案2:修改Radius时同步更新周长存储值(适合计算逻辑复杂、读取频率远高于修改频率的场景)

用后台字段存储周长值,每次修改Radius时同步重新计算并更新周长字段:

public class Circle
{
    public double X { get; set; }
    public double Y { get; set; }
    
    private double _radius;
    private double _circumference;
    public double Radius
    {
        get => _radius;
        set
        {
            _radius = value < 0 ? 0 : value;
            // Radius修改时同步更新周长
            _circumference = _radius * 2 * Math.PI;
        }
    }
    
    public double Circumference => _circumference;

    public Circle(double x, double y, double radius)
    {
        X = x;
        Y = y;
        Radius = radius;
    }
}

两种方案都可以让你的三条单元测试断言全部通过。

内容的提问来源于stack exchange,提问作者jonasPamm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:15:02