C#, как спроектировать несколько интерфейсов, чтобы иметь доступ к одним и тем же делегатам? - PullRequest
0 голосов
/ 08 апреля 2020

Захватив код моего босса, который является сервис-ориентированной архитектурой, у меня есть интерфейс, подобный приведенному ниже:

namespace MyCompany.Namespace
{
    delegate void DataEvent(string id, IDataFrame frame);
    delegate void LogMessage(MessageType type, string id, string message);
    delegate void ReadyStateChanged(string id, Device state);

    interface IDeviceService
    {
        void Trigger();
        void Start();
        void Stop();

        event DataEvent NewDataFrame;
        event LogMessage LogMessage;
        event ReadyStateChanged StateChanged;

        void ChangeState(Device newState);

        // other method stubs
    }
}

Этот интерфейс используется для создания службы устройств, которая использует делегатов для передачи событий назад. и далее из отдельного потока в главный объект в другом потоке. Я хотел бы построить другой сервис, который использует аналогичную модель. Я считаю, что новый сервис должен быть основан на другом интерфейсе, поэтому мне придется создать другой интерфейс. Мне бы хотелось, чтобы новый интерфейс использовал те же делегаты, что и выше, но, поскольку вышеупомянутые делегаты определены вне интерфейса, в общем пространстве имен, я не могу переопределить их (это имеет смысл).

Если Я хотел бы, чтобы два (или более) интерфейса в одном пространстве имен могли использовать одни и те же делегаты, что мне делать? Могу ли я создать «суперинтерфейс», в котором хранятся делегаты? Или суперкласс, у которого есть делегаты? Может быть, существует лучший дизайн?

1 Ответ

0 голосов
/ 08 апреля 2020

Надеюсь, я понял ваш вопрос, но если все интерфейсы находятся в одном и том же пространстве имен, проблем не должно быть. Не могли бы вы дать мне знать, если вы это имели в виду, или я упускаю суть?

// InterfaceTest1.cs
namespace MyCompany.Namespace
{
    delegate void DataEvent(string id, string frame);
    delegate void LogMessage(int type, string id, string message);
    delegate void ReadyStateChanged(string id, string state);

    interface IDeviceService
    {
        void Trigger();
        void Start();
        void Stop();

        event DataEvent NewDataFrame;
        event LogMessage LogMessage;
        event ReadyStateChanged StateChanged;

        void ChangeState(string newState);

        // other method stubs
    }
}

// InterfaceTest2.cs
namespace MyCompany.Namespace
{
    interface IAnotherInterface
    {
        void Test();

        event DataEvent NewDataFrame;
        event LogMessage LogMessage;
        event ReadyStateChanged StateChanged;
    }
}

// TesterClass1.cs
using MyCompany.Namespace;

namespace SearchInFile
{
    class TesterClass1 : IDeviceService
    {
        public void Trigger()
        {

        }

        public void Start()
        {

        }

        public void Stop()
        {

        }

        public void ChangeState(string newState)
        {

        }

        public event DataEvent NewDataFrame;
        public event LogMessage LogMessage;
        public event ReadyStateChanged StateChanged;

        protected virtual void OnNewDataFrame(string id, string frame)
        {
            NewDataFrame?.Invoke(id, frame);
        }
        protected virtual void OnLogMessage(int type, string id, string message)
        {
            LogMessage?.Invoke(type, id, message);
        }
        protected virtual void OnStateChanged(string id, string state)
        {
            StateChanged?.Invoke(id, state);
        }
    }
}

// TesterClass2.cs
using MyCompany.Namespace;

namespace SearchInFile
{
    class TesterClass2 : IAnotherInterface
    {
        public void Test()
        {

        }

        public event DataEvent NewDataFrame;
        public event LogMessage LogMessage;
        public event ReadyStateChanged StateChanged;

        protected virtual void OnNewDataFrame(string id, string frame)
        {
            NewDataFrame?.Invoke(id, frame);
        }
        protected virtual void OnLogMessage(int type, string id, string message)
        {
            LogMessage?.Invoke(type, id, message);
        }
        protected virtual void OnStateChanged(string id, string state)
        {
            StateChanged?.Invoke(id, state);
        }
    }
}
...