【问题标题】:How to make my enums inherit from a class?如何让我的枚举从一个类继承?
【发布时间】:2016-05-16 21:40:59
【问题描述】:

自述文件优先

  • 我有多种能力,每种能力都属于AbilityCategory 类型。

  • AbilityCategory 类型的示例有 AbilityCategory_MagicAbilityCategory_PhysicalAbilityCategory_RangedAbilityCategory_Biological 和列表继续……

  • AbilityCategories 是派生自 Ability 的类。

  • Ability 是一个只能实例化的类,AbilityBaseData 对象被传递到其构造函数中。

  • 我想找到将每个能力链接到名为 defaultAbilityBaseDatabase 的 Dictionary 中的一个 AbilityBaseData 的方法。

  • 在我的 defaultAbilityBaseDatabase 中,每个能力最多只能链接到 1 个 AbilityBaseData 实例。


-- AbilityBaseData.cs

[System.Serializable]
public class AbilityBaseData{
    [SerializableField] Sprite abilityImage;
}

我目前的代码结构:

-- AbilityDatabase.cs

enum EAbilityCategory_Magic{
    Fireball,
    IceBolt,
    BlackMagic
};
enum EAbilityCategory_Physical{
    SwordLance,
    FearlessBlow,
    RagnarokRage
};
enum EAbilityCategory_Ranged{
    Snipe,
    RainOfArrows,
    CrossbowShot
};
enum EAbilityCategory_Biological{
    VirusUnleash,
    SuperBug
};
enum Eblabla{};
enum Eevenmore{};
... There are many more abilities ...
...

Dictionary<EAbilityCategory_Magic,AbilityBaseData> defaultMagicAbilityBaseDataDatabase;
Dictionary<EAbilityCategory_Physical,AbilityBaseData> defaultPhysicalAbilityBaseDataDatabase;
Dictionary<EAbilityCategory_Ranged,AbilityBaseData> defaultRangedAbilityBaseDataDatabase;
Dictionary<EAbilityCategory_Biological,AbilityBaseData> defaultBiologicalAbilityBaseDataDatabase;
... list keeps going on...

代码结构查找:

-- AbilityDatabase.cs

enum class EAbility{}
enum EAbilityCategory_Magic : EAbility{
    Fireball,
    IceBolt,
    BlackMagic
};
enum EAbilityCategory_Physical : EAbility{
    SwordLance,
    FearlessBlow,
    RagnarokRage
};
enum EAbilityCategory_Ranged : EAbility{
    Snipe,
    RainOfArrows,
    CrossbowShot
};
enum EAbilityCategory_Biological : EAbility{
    VirusUnleash,
    SuperBug
};
... There are many more abilities ...
...

Dictionary<EAbility,AbilityBaseData> defaultAbilityBaseDataDatabase;

这是我遇到此问题后尝试使用的解决方法

What variable type should I use to store types of a non sealed class or interface?

其中可能是这样的:

//I can remove all enumerations have such a clean, one-line code
Dictionary<typeof(Ability),AbilityBaseData> defaultAbilityBaseDataDatabase;

我无法像这样结合所有能力:

enum EAbility{
    Fireball,IceBolt,BlackMagic,SwordLance,FearlessBlow,RagnarokRage,Snipe,.....
};

因为它会阻止我这样做:

-- MagicAbilityFactory.cs

AbilityCategory_Magic Create(EAbilityCategory_Magic magicAbilityCategory, AbilityBaseData defaultAbilityBaseData){
    switch(magicAbilityCategory){
    case Fireball:
        return new AbilityCategory_Magic_Fireball(abilityBaseData,other parameters);
    case blabla:
    }
    return null;
}

这可能是https://stackoverflow.com/posts/3460047/revisions 的一个选项,但问题是我宁愿找到一个干净的解决方案,它不需要我添加这么多行代码,因为我有成千上万的能力..

【问题讨论】:

  • 像你继续做的那样乞求代表是不受欢迎的。有一些方法可以获得代表,并在您的问题中包括对赞成票的请求,不是吗。

标签: c# enums base-class


【解决方案1】:

这在 C# 中是不可能的。这个决定的有利权衡是 enums 是值类型,因此是轻量级结构而不是类。这减少了 GC 对这些常见的非常小的对象的内存压力。如果您对 C# 团队的这一设计决定有疑问,那么您应该向 Microsoft 提出。

如果您需要通过 Enum 类的静态方法和扩展方法提供的功能之外的其他功能,只需从头开始声明您自己的自定义类/结构和继承层次结构。

来自 MSDN Enumeration Types:

所有枚举都是System.Enum类型的实例。您不能从 System.Enum 派生新类,但您可以使用它的方法来发现有关 enum 实例中的值的信息并对其进行操作。

来自 MSDN 上的课程 System.Enum

【讨论】:

猜你喜欢
  • 2023-02-24
  • 1970-01-01
  • 2015-11-29
  • 2010-10-19
相关资源
最近更新 更多