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

如何实现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())

实现步骤

  1. 修改Engine类:移除对Keys的继承,改为内部持有Keys实例,并暴露一个只读的Keys属性。同时处理IDisposable接口,确保Keys实例能被正确释放。
  2. 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())

实现步骤

  1. 修改Engine类:移除对Keys的继承,添加一个返回Keys实例的方法(可按需返回单例或新实例),同时处理IDisposable。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:55:16