簡體   English   中英

從基抽象類和 IDisposable 的正確位置繼承接口

[英]Inheriting an interface from a base abstract class and IDisposable's correct place

我有以下結構。

問題:

  • 是否需要 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
    }
}

您是否需要IStrategy接口取決於您使用它的上下文,所以不清楚。 但是,將IStrategyStart ()方法和StrategyBaseabstract Start()方法似乎是重復的,這表明您只需要基類。

關於放置Dispose() ,一般規則是對象應該放置在創建它們的同一類中。 (如果可能的話,用同樣的方法,但這僅適用於非常短暫的對象,而不是這里的情況。)

您沒有顯示SocketClientClient的創建位置,但它們是在StrategyBase中聲明的,這表明它們應該被放置在那里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM