首页 > 解决方案 > C#,如何设计多个接口以访问相同的委托?

问题描述

获取我老板的代码,这是一种面向服务的架构,我有一个如下所示的界面:

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
    }
}

此接口用于构建设备服务,该服务使用委托将事件从单独的线程来回传递到另一个线程上的主对象。我想建立另一个使用类似模型的服务。我相信新服务需要基于不同的接口,所以我必须创建另一个接口。我希望新接口使用与上面相同的委托,但由于上面的委托是在接口之外定义的,在整个命名空间中,我无法重新定义它们(这是有道理的)。

如果我希望同一个命名空间中的两个(或更多)接口能够使用相同的委托,我应该怎么做?我可以创建一个存储代表的“超级界面”吗?还是有代表的超类?也许存在更好的设计?

标签: c#interfacedelegatessoa

解决方案


我希望我理解你的问题,但是如果所有接口都在同一个命名空间中,那么应该没有问题。如果这就是你的意思或者我错过了重点,请告诉我?

// 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);
        }
    }
}

推荐阅读