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
相关产品推荐
相关产品推荐

