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

C#齿轮类自动更新及齿轮组属性封装问题求助

问题解决方案

一、ToothedWheel类:属性变化自动更新计算值

要实现Z(齿数)或m_0(模数)变化时自动更新d_0(分度圆直径),同时避免每次读取d_0都重复计算,核心逻辑如下:

  • 用私有字段存储Z、m_0和d_0的实际值
  • 在Z和m_0的属性set块中,仅当值发生变化时调用Update方法执行计算
  • d_0直接返回已计算好的私有字段值,无需重复计算

修改后的代码:

public class ToothedWheel
{
    private int _z = 16;
    private double _m0 = 8;
    private double _d0;

    public ToothedWheel(int z = 16, double m0 = 8)
    {
        _z = z;
        _m0 = m0;
        Update(); // 初始化时完成首次计算
    }

    public void Update()
    {
        _d0 = _m0 * _z;
        // 后续复杂计算逻辑可在此扩展,仅在属性变更时执行
    }

    public int Z 
    { 
        get => _z; 
        set 
        {
            if (_z != value)
            {
                _z = value;
                Update();
            }
        } 
    } // 齿数

    public double m_0 
    { 
        get => _m0; 
        private set 
        {
            if (_m0 != value)
            {
                _m0 = value;
                Update();
            }
        } 
    } // 模数(mm)

    public double d_0 => _d0; // 分度圆直径(mm)
}

效果:修改Z或m_0时会自动触发Update更新d_0,读取d_0时直接返回缓存值,避免重复计算。

二、Gear类:保证齿轮模数一致并封装权限

要禁止外部直接修改单个齿轮的m_0,但允许修改Z,同时保证两个齿轮模数一致,核心逻辑如下:

  • 把ToothedWheel的m_0属性set设为private,外部无法直接修改
  • 给ToothedWheel添加一个internal修饰的方法,允许同程序集内的Gear类修改模数
  • Gear类统一管理模数,通过调用内部方法同步两个齿轮的模数

第一步:修改ToothedWheel添加内部方法

在ToothedWheel类中添加用于修改模数的内部方法:

public class ToothedWheel
{
    // 保留前面的所有代码...

    // 仅允许同程序集内的类修改模数
    internal void SetModule(double newModule)
    {
        if (_m0 != newModule)
        {
            _m0 = newModule;
            Update();
        }
    }
}

第二步:实现Gear类

修改Gear类,确保通过自身的m_0属性统一控制两个齿轮的模数:

public class Gear
{
    // 公开只读的齿轮实例,外部可修改Z但无法直接修改m_0
    public ToothedWheel Pinion { get; }
    public ToothedWheel Wheel { get; }

    private double _m0 = 8;

    public Gear()
    {
        Pinion = new ToothedWheel(m0: _m0);
        Wheel = new ToothedWheel(m0: _m0);
    }

    // 重载构造函数,支持初始化时指定参数
    public Gear(int pinionZ, int wheelZ, double m0 = 8)
    {
        _m0 = m0;
        Pinion = new ToothedWheel(pinionZ, _m0);
        Wheel = new ToothedWheel(wheelZ, _m0);
    }

    public double m_0
    {
        get => _m0;
        set
        {
            if (_m0 != value)
            {
                _m0 = value;
                // 通过内部方法同步两个齿轮的模数
                Pinion.SetModule(_m0);
                Wheel.SetModule(_m0);
            }
        }
    }
}

效果:

  • 外部代码可以自由修改Pinion.Z和Wheel.Z
  • 无法直接修改Pinion.m_0或Wheel.m_0(因为set是private)
  • 修改Gear的m_0属性时,两个齿轮的模数会自动同步,保证一致性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 06:10:34