【问题标题】:Best practice for dealing with duplicate classes in separate namespaces处理不同命名空间中重复类的最佳实践
【发布时间】:2014-02-16 16:18:58
【问题描述】:

我使用 XNA 作为我的游戏的框架。在我的Input 课程中,我使用 XNA 获取键盘状态并检测按键:

namespace MyGame.Classes
{
    public class Input : IInput
    {
        public bool DetectKey( Keys key )
        {
            if ( Keyboard.GetState().IsKeyDown( key ) )
            {
                return true;
            }

            return false;
        }
    }
}

最近我一直在尝试集成 Newtonsoft.Json 来管理我的游戏的配置设置。在另一堂课中,我阅读了 JSON 文件:

{
    "Settings": {
        // ...
    },
    "Controls": {
        "Keyboard": {
            "W": "Up",
            "A": "Left",
            "S": "Down",
            "D": "Right"
        }
    }
}

然后我将 JSON 转换为强类型对象:

namespace MyGame.Classes
{
    public class Config
    {
        public Settings Settings = new Settings();
        public Controls Controls = new Controls();
    }

    public class Controls
    {
        public Keyboard Keyboard = new Keyboard();
    }

    public class Keyboard
    {
        public string W = "Default";
        public string A = "Default";
        public string S = "Default";
        public string D = "Default";
    }
}

我遇到的问题是我想在我的 Input 类中同时使用 Keyboard 类(MyGame.Classes.KeyboardMicrosoft.Xna.Framework.Input.Keyboard),如下所示:

namespace MyGame.Classes
{
    public class Input : IInput
    {
        public bool DetectUp( Config config )
        {
            // Convert string to enum
            var key = GetKey( config.Controls.Keyboard.W );
            return DetectKey( key );
        }
    }
}

显然编译器对此并不满意。我一直在寻找解决方案,但大多数提出此问题的人都可以控制所讨论的两个命名空间。我不确定如何根据我的情况调整这些解决方案:

我尝试将其添加到 Input 的顶部:

using Keyboard = Microsoft.Xna.Framework.Input.Keyboard;
using KeyboardConfig = MyGame.Classes.Keyboard;

这不起作用,因为编译器仍然尝试使用MyGame.Classes.Keyboard 来解析类中的每个Keyboard

对我来说最好的方法是什么?

【问题讨论】:

    标签: c# json class xna namespaces


    【解决方案1】:

    你是对的,你应该使用那些使用语句标识符的。

    我猜这也不起作用,因为您将类名放在 using 语句中和/或使用了与类名相同的标识符名称。

    你尝试过这样的事情吗?

    using kb = Microsoft.Xna.Framework.Input;
    
    var test = kb.Keyboard.GetState(...);
    

    【讨论】:

    • 这行得通。但我并不热衷于为 XNA 的 Keyboard 类的每次使用添加前缀,所以我最终将 MyGame.Classes.Config 和相关类移动到不同的命名空间 MyGame.Settings。然后我可以将using Keyboard = Microsoft.Xna.Framework.Input.Keyboard; 添加到我的Input 类中,一切都很好。
    猜你喜欢
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 2013-11-18
    • 2019-03-08
    • 2021-09-02
    • 1970-01-01
    • 2014-07-21
    • 2013-05-18
    相关资源
    最近更新 更多