首页 > 解决方案 > 从基抽象类和 IDisposable 的正确位置继承接口

问题描述

我有以下结构。

问题:

public interface IStrategy
{
    public void Start(Bot bot, CancellationToken token);
}

public abstract class StrategyBase : IStrategy
{
    public IBinanceClient Client { get; }
    public IBinanceSocketClient SocketClient { get; }

    protected StrategyBase(string apiKey, string secretKey)
    {
        Client = new BinanceClient(new BinanceClientOptions()
        {
            ApiCredentials = new ApiCredentials(apiKey, secretKey),
            AutoTimestamp = true,
            AutoTimestampRecalculationInterval = TimeSpan.FromMinutes(30)
        });

        SocketClient = new BinanceSocketClient(new BinanceSocketClientOptions()
        {
            ApiCredentials = new ApiCredentials(apiKey, secretKey),
            AutoReconnect = true,
            ReconnectInterval = TimeSpan.FromMinutes(1)
        });
    }

    public List<BinanceStreamTick> Tickers { get; set; }

    // Methods that all strategies use
    public void GetTickers()
    {
        ... implementation
    }

    public abstract void Start(Bot bot, CancellationToken token); // ???
}

public class CompositeStrategy : StrategyBase, IDisposable
{
    public CompositeStrategy(string apiKey, string secretKey) : base(apiKey, secretKey)
    {
    }

    public override void Start(Bot bot, CancellationToken token)
    {
        ... implementation
    }

    private bool _disposed = false;

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (_disposed)
            return;

        if (disposing)
        {
            if (Client != null)
                Client.Dispose();

            if (SocketClient != null)
            {
                SocketClient.UnsubscribeAll();
                SocketClient.Dispose();
            }
        }

        _disposed = true;
    }
}

编辑:

其他方式,基于@Wiktor Zychla 的评论。

public interface IStrategy
{
    public void Start(Bot bot, CancellationToken token);
}

public abstract class StrategyBase : IStrategy, IDisposable
{
    public IBinanceClient Client { get; }
    public IBinanceSocketClient SocketClient { get; }

    protected StrategyBase(string apiKey, string secretKey)
    {
        Client = new BinanceClient(new BinanceClientOptions()
        {
            ApiCredentials = new ApiCredentials(apiKey, secretKey),
            AutoTimestamp = true,
            AutoTimestampRecalculationInterval = TimeSpan.FromMinutes(30)
        });

        SocketClient = new BinanceSocketClient(new BinanceSocketClientOptions()
        {
            ApiCredentials = new ApiCredentials(apiKey, secretKey),
            AutoReconnect = true,
            ReconnectInterval = TimeSpan.FromMinutes(1)
        });
    }

    public List<BinanceStreamTick> Tickers { get; set; }

    public void GetTickers()
    {
        ... implementation
    }

    public abstract void Start(Bot bot, CancellationToken token);

    private bool _disposed = false;

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (_disposed)
            return;

        if (disposing)
        {
            if (Client != null)
                Client.Dispose();

            if (SocketClient != null)
            {
                SocketClient.UnsubscribeAll();
                SocketClient.Dispose();
            }
        }

        _disposed = true;
    }
}

public class CompositeStrategy : StrategyBase
{
    public CompositeStrategy(string apiKey, string secretKey) : base(apiKey, secretKey)
    {
    }

    public override void Start(Bot bot, CancellationToken token)
    {
        ... implementation
    }
}

标签: c#

解决方案


您是否需要该IStrategy接口取决于您使用它的上下文,因此不清楚。但是,IStrategy使用Start ()方法和StrategyBase使用abstract Start()方法似乎是重复的,这表明您只需要基类。

关于将 放在哪里Dispose(),一般规则是对象应该放置在创建它们的同一个类中。(如果可能,使用相同的方法,但这仅适用于非常短暂的对象,而不是这里的情况。)

您没有显示在哪里创建SocketClientClient创建,但它们在 中声明StrategyBase,这表明它们应该被放置在哪里。


推荐阅读