Enums 有没有可扩展枚举的编程语言?

Enums 有没有可扩展枚举的编程语言?,enums,extends,Enums,Extends,许多面向对象语言允许类的扩展,因此: class Animal {} class Cat extends Animal {} class Dog extends Animal {} 但是,在使用枚举时,有些情况下需要相反的功能。例如: enum CatAction { meow, eat, sleep } enum DogAction { bark, fetch, eat, sleep } enum AnimalAction { eat, sleep } 这里有些

许多面向对象语言允许类的扩展,因此:

class Animal {}
class Cat extends Animal {}
class Dog extends Animal {}
但是,在使用枚举时,有些情况下需要相反的功能。例如:

enum CatAction {
    meow, eat, sleep
}

enum DogAction {
    bark, fetch, eat, sleep
}

enum AnimalAction {
    eat, sleep
}
这里有些冗余。
AnimalAction
必须是
CatAction
,因为如果任意的
动物可以执行动作,那么根据定义,
Cat
可以执行动作。但是,即使是具有多重继承的语言也不允许定义
枚举AnimalAction extensed CatAction、DogAction{}
,而且该语法也不能避免冗余

这可以用
generalizes
或类似的关键字来修复

enum AnimalAction {
    eat, sleep
}

enum CatAction generalizes AnimalAction {
    meow
}

enum DogAction generalizes AnimalAction {
    bark, fetch
}
此功能还使某些模式更加方便:

enum Direction2D {
    North, East, South, West
}

enum Direction3D generalizes Direction2D {
    Up, Down
}
有任何编程语言支持此功能吗?

我认为C++可以

struct Animal{
  enum{
    eat,
    sleep
  };
};

struct Cat : Animal{
  enum{
    meow,
    glare,
    hiss
  };
};

struct Dog : Animal{
  enum{
    bark,
    fetch,
    peeOnCarpet
  };
};
枚举的值与声明枚举的范围相同。但是,每个枚举的第一个元素从零开始,因此除非您具有特定的animal/derivedAnimal函数,否则您可能希望确保每个元素都是唯一的

您可以通过在每个基类中添加一个标记来解决这个问题,我不确定我是否喜欢它,但是它是有效的

这段代码是为Arduino(C++)编写的


OCaml的多态变体非常接近(尽管与枚举不同,它们不是数字)

下面是一个例子:

type animal_action = [`Eat | `Sleep]

type cat_action = [animal_action | `Meow]

type dog_action = [animal_action | `Woof]
您可以有多个包含,但它是包含的:这将导致
cat\u action
dog\u action
中的构造函数合并

type catdog_action = [cat_action | dog_action]
(* [`Eat | `Sleep | `Meow | `Woof] : that is, not what you wanted. *)
多态变体实际上是一个比这个例子所暗示的更复杂的特性,但我不认为深入细节将有助于回答您的问题

type catdog_action = [cat_action | dog_action]
(* [`Eat | `Sleep | `Meow | `Woof] : that is, not what you wanted. *)