GameFramework摘录 - 3. 使用interface定义对外接口

GameFramework的模块密封性相当好,如果使用unity的assemblydef,其设计可以把框架项目与自己的游戏逻辑分离开来。
除一些常用的基类、枚举等,核心模块设置为internal权限,密封在框架项目中。
在游戏逻辑需求时,通过入口类GameFrameworkEntry获取

其对外接口由interface定义,如EventManager的实现:

namespace GameFramework.Event
{
    public internal IEventManager
    {
        int EventHandlerCount
        {
            get;
        }
        
        int EventCount
        {
            get;
        }
        
        // ...
    }

    internal sealed class EventManager : GameFrameworkModule, IEventManager
    {
        // ...
    }
}

接口IEventManager实际在整个框架内只用了一次,并没有起到interface通常的“抽象”功能,而是作为从外部到框架模块的入口。

public static class GameFrameworkEntry
{
    public static T GetModule() where T : class
    {
        Type interfaceType = typeof(T);
        if (!interfaceType.IsInterface)
        {
            throw new GameFrameworkException("...");
        }
        
        if (!interfaceType.FullName.StartsWith("GameFramework."))
        {
            throw new GameFrameworkException("...");
        }

        string moduleName = string.Format("{0}.{1}", interfaceType.Namespace, interfaceType.Name.Substring(1));
        Type moduleType = Type.GetType(moduleName);
        if (moduleType == null)
        {
            throw new GameFrameworkException("...");
        }

        return GetModule(moduleType) as T;
    }
}

可以看出, GameFramework.Event.IEventManager只是GameFramework.Event.EventManager的对外接口
在使用框架时

    IEventManager mgr = GameFrameworkEntry.GetModule();
    Console.WriteLine(mgr.EventHandlerCount);

你可能感兴趣的:(GameFramework摘录 - 3. 使用interface定义对外接口)