【问题标题】:How to Disambiguate Between External Class and Nested Class如何区分外部类和嵌套类
【发布时间】:2019-07-29 05:52:11
【问题描述】:

我的一个类称为SpaceMine,而我的另一个类称为Ability,并且其中嵌套了一个称为SpaceMine的类:

public class SpaceMine
{

}

public class Ability
{
    public class SpaceMine :  Ability
    {
        void Foo()
        {
            SpaceMine spaceMine;
        }
    }
}

Foo() 中,我试图声明一个SpaceMine 类型的变量(不是Ability.SpaceMine),但它一直说我的变量是Ability.SpaceMine 类型。除了更改名称之外,我如何确保编译器知道我要声明的类型?

【问题讨论】:

  • 首先,它绝对会破坏可读性,不要在实际项目中使用
  • 最好不要嵌套它们并使用前缀/后缀,例如 SpaceMineAbility。除了偶尔的结构之外,嵌套类会让你在一个月后头疼数小时
  • 您能否更具体地说明它是如何降低可读性并导致头痛的?对我来说,它看起来更有条理,也更有意义。

标签: c# class unity3d nested disambiguation


【解决方案1】:

我希望您只需要使用完整路径。

我假设 SpaceMine 在命名空间内 - 如果不是,您需要将整个文件包装在命名空间中。

然后您可以通过new YourNamespace.SpaceMine(); 获取父级,或new YourNamespace.Ability.SpaceMine() 访问嵌套级。

我不建议这样做,因为可读性会受到严重影响。

【讨论】:

    【解决方案2】:

    使用显式声明

    namespace SpaceName
    {
        public class SpaceMine
        {
    
        }
    
        public class Ability
        {
            public class SpaceMine :  Ability
            {
                void Foo()
                {
                    Ability.SpaceMine nestedMine; //Nested
                    //Ability is reducant but it improves readability a little
                    SpaceName.SpaceMine globalMine; //Not nested
                }
            }
        }
    }
    

    【讨论】:

    • 啊,我明白了。如果我没记错的话,是不是有一个 global 命名空间,不是所有不在命名空间中的类都默认使用的命名空间?我试过了,但编译器似乎不明白我想要做什么。
    • @AgentTatsu 是的,有全局命名空间 (stackoverflow.com/questions/25491518/…) 但这不是一个好习惯 - 您应该在任何地方使用命名空间以免丢失您的工作;)
    猜你喜欢
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    • 2017-01-25
    相关资源
    最近更新 更多