如何使用第三方代码而不集成到我自己的代码中? (C#)

时间:2017-10-05 15:40:45

标签: c# unity3d design-patterns interface

我想在Unity3d游戏中使用第三方网络资产。

TL; DR:出于以下原因,在没有将资产代码真正集成到我自己的代码中的情况下使用资产的最佳解决方案是什么:

  1. 资产正在定期更新。
  2. 未来我可能希望将该网络资产更改为我自己的\其他解决方案。
  3. 我最初的解决方案是创建一个名为 INetworkProvider 的接口,所有网络解决方案都将实现该接口,创建一个将从第三方类驱动的类,该类将处理我对该对象的请求。

    问题是当第三方资产需要我的代码不知道的类型时会发生什么?

    在我的示例中,接口 INetworkProvider Init()功能可以正常工作,但 ConnectToMaster()功能将无法正常工作,因为我的 NetworkManager 类无法识别 SpecialParams 类型,我该怎么办?

    在第三方驱动器类中创建 SpecialParams 类型并将其传递给ConnectToMaster功能?

    我的解决方案示例:

    所有网络提供商将实施的 INetworkProvider 接口

    public interface INetworkProvider {
        void Init();
        void ConnectToMasterServer(string ip,int port,SpecialParams sp);
    }
    

    将从第三方资产开出并实施 INetworkProvider 的类:

    public FirstProvider : NetworkAsset.API,INetworkProvider {
    
        public void Init()
        {
          // Do init
        }
    
        public new void ConnectToMasterServer(strin ip,int port,SpecialParams sp)
        {
            // 3rd party API requires SpecialParams Type
            API.ConnectToMasterServer (ip,port,sp);
        }
    }
    

    我的 NetworkManager 将使用提供程序接口并调用Init和ConnectToMaster fucn

    public class NetworkManager : MonoBehaviour {
          // Define which network providers we have
        public enum ProviderType { FirstProvider,SecondProvider }
        public ProviderType providerType;
    
        private static INetworkProvider provider;
    
        void Awake(){           // Unity awake function
            InitProvider ();
        }
    
        public void InitProvider()
        {
            switch (providerType) 
            {
                case ProviderType.FirstProvider:
                    provider = gameObject.AddComponent<FirstProvider> ();
                    break;
    
                case ProviderType.SecondProvider:
                    provider = gameObject.AddComponent<SecondProvider> ();
                    break;
    
                default: Debug.LogError ("Provider Script not found!");
                    break;
            }
            provider.Init (); // would work fine
        }
    
        public void ConnectToMasterServer()
        {
            // error here because SpecialParams Type is not recognized here
            provider.ConnectToMasterServer ("127.0.0.1",6000,new SpecialParams); 
        }
    }
    

0 个答案:

没有答案