如何实现Engine类以engine.Keys.GenerateKeys()形式调用Keys类方法?
实现Engine类通过
engine.Keys.GenerateKeys()或engine.Keys().GenerateKeys()调用密钥生成方法的方案 问题背景
现有C#代码中,Engine类继承自Keys类,当前可直接通过Engine实例调用Keys的GenerateKeys()方法。需求改为通过engine.Keys.GenerateKeys()(属性形式)或engine.Keys().GenerateKeys()(方法形式)调用该方法,以下是可行的实现方案。
方案1:属性形式(engine.Keys.GenerateKeys())
实现步骤
- 修改
Engine类:移除对Keys的继承,改为内部持有Keys实例,并暴露一个只读的Keys属性。同时处理IDisposable接口,确保Keys实例能被正确释放。 Keys类保持不变。
修改后的代码
Engine类
public class Engine : IEngine, IDisposable { private readonly Network _network; private readonly Keys _keys; // 持有Keys实例 public Engine(bool useMainNet = false) { _network = useMainNet ? Network.Main : Network.TestNet; _keys = new Keys(useMainNet); // 初始化Keys实例 } // 暴露Keys属性供外部调用 public Keys Keys => _keys; public Network GetCurrentNetwork() => _network; // 实现IDisposable,释放Keys实例 public void Dispose() { _keys.Dispose(); GC.SuppressFinalize(this); } }
调用示例
using (Engine engine = new(true)) { string keys = engine.Keys.GenerateKeys(); }
方案2:方法形式(engine.Keys().GenerateKeys())
实现步骤
- 修改
Engine类:移除对Keys的继承,添加一个返回Keys实例的方法(可按需返回单例或新实例),同时处理IDisposable。 Keys类保持不变。
修改后的代码
Engine类(返回单例实例)
public class Engine : IEngine, IDisposable { private readonly Network _network; private readonly Keys _keys; public Engine(bool useMainNet = false) { _network = useMainNet ? Network.Main : Network.TestNet; _keys = new Keys(useMainNet); } // 返回Keys实例的方法 public Keys Keys() { return _keys; } public Network GetCurrentNetwork() => _network; public void Dispose() { _keys.Dispose(); GC.SuppressFinalize(this); } }
调用示例
using (Engine engine = new(true)) { string keys = engine.Keys().GenerateKeys(); }
如果每次调用Keys()都需要新的Keys实例,可修改方法实现:
public Keys Keys() { return new Keys(_network == Network.Main); // 根据当前网络创建新实例 }
注意:这种方式每次调用都会生成新的
Keys实例,需要调用方自行管理实例的释放,或者在Engine的Dispose中不处理该实例(因为是临时创建的)。
关键说明
- 两种方案都需要移除
Engine对Keys的继承,避免继承带来的方法暴露,转而通过组合的方式实现功能调用,符合面向对象的组合优于继承原则。 - 若原代码中
Engine依赖Keys的其他方法,只需通过_keys实例调用即可,无需修改外部调用逻辑(除了GenerateKeys()的调用方式)。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

