从基本抽象类和IDisposable的正确位置继承接口

时间:2020-03-27 11:13:58

标签: c#

我的结构如下。

问题:

  • 是否完全需要IStrategy接口?因为我见过人们在做我做过的事情-在基类中有一个Start方法定义为abstract,并且他们也通过定义它的接口来公开它。但是,其他人认为仅在基类中指定Start方法就足够了,并且根本不需要接口,因为代码变得更加复杂。您对此有何看法?
  • 我正在基类中定义IBinanceClientIBinanceSocketClient,它们都必须放在某个位置。在下面的代码中,我在派生类中实现了IDisposable,但是我认为将其移入基类是一个更好的决定,因为BinanceClient是在此定义的。你觉得呢?
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
    }
}

1 个答案:

答案 0 :(得分:0)

是否需要IStrategy接口取决于您使用此接口的上下文,因此尚不清楚。但是,将IStrategyStart ()方法一起使用并将StrategyBaseabstract Start()方法一起使用似乎是重复的,这表明您只需要基类。 / p>

关于放置Dispose()的位置,一般规则是对象应与创建它们的类放在相同的类中。 (如果可能的话,使用相同的方法,但这仅适用于寿命很短的对象,而不是这种情况。)

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

相关问题