C#,如何设计多个接口以访问同一委托?

问题描述 投票:0回答:1

抓住我老板的代码,这是一种面向服务的体系结构,我有一个类似于下面的界面:

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# interface delegates soa
1个回答
0
投票

我希望我能理解您的问题,但是如果所有接口都在同一个命名空间中,应该不会有问题。请问这是您的意思,还是我错过了要点?

// 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);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.