是否有具有可扩展枚举的编程语言?
Is there a programming language with extensible enums?
许多面向对象的语言允许 类 的扩展,因此:
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
,因为如果任意 Animal
可以执行该操作,那么根据定义 Cat
可以执行它。然而,即使是具有多重继承的语言也不允许定义 enum AnimalAction extends 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 函数,否则您可能希望确保每个都是唯一的。
你可以通过在每个碱基中添加一个标记来解决这个问题class,我不确定我是否喜欢它,但它确实有效。
此代码是为 Arduino (C++) 编写的。
struct Animal{
enum Action{
eat,
sleep,
die,
end
};
};
struct Dog : Animal{
enum Action{
bark = Animal::Action::end,
fetch,
peeOnCarpet
};
};
void setup() {
Dog d;
Serial.begin(9600);
Serial.println( "Values: " );
Serial.println( d.eat, DEC );
Serial.println( d.sleep, DEC );
Serial.println( d.die, DEC );
Serial.println( d.bark, DEC );
Serial.println( d.fetch, DEC );
Serial.println( d.peeOnCarpet, DEC );
}
void loop() { }
OCaml 的多态变体很接近(尽管与枚举不同,它们不是数字)。
示例如下:
type animal_action = [`Eat | `Sleep]
type cat_action = [animal_action | `Meow]
type dog_action = [animal_action | `Woof]
您可以有多个包含,但它是 包含:这导致 cat_action
和 dog_action
中构造函数的并集。
type catdog_action = [cat_action | dog_action]
(* [`Eat | `Sleep | `Meow | `Woof] : that is, not what you wanted. *)
多态变体实际上是一个比这个例子所暗示的更复杂的特征,但我不认为深入细节将有助于回答你的问题。
许多面向对象的语言允许 类 的扩展,因此:
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
,因为如果任意 Animal
可以执行该操作,那么根据定义 Cat
可以执行它。然而,即使是具有多重继承的语言也不允许定义 enum AnimalAction extends 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 函数,否则您可能希望确保每个都是唯一的。
你可以通过在每个碱基中添加一个标记来解决这个问题class,我不确定我是否喜欢它,但它确实有效。
此代码是为 Arduino (C++) 编写的。
struct Animal{
enum Action{
eat,
sleep,
die,
end
};
};
struct Dog : Animal{
enum Action{
bark = Animal::Action::end,
fetch,
peeOnCarpet
};
};
void setup() {
Dog d;
Serial.begin(9600);
Serial.println( "Values: " );
Serial.println( d.eat, DEC );
Serial.println( d.sleep, DEC );
Serial.println( d.die, DEC );
Serial.println( d.bark, DEC );
Serial.println( d.fetch, DEC );
Serial.println( d.peeOnCarpet, DEC );
}
void loop() { }
OCaml 的多态变体很接近(尽管与枚举不同,它们不是数字)。
示例如下:
type animal_action = [`Eat | `Sleep]
type cat_action = [animal_action | `Meow]
type dog_action = [animal_action | `Woof]
您可以有多个包含,但它是 包含:这导致 cat_action
和 dog_action
中构造函数的并集。
type catdog_action = [cat_action | dog_action]
(* [`Eat | `Sleep | `Meow | `Woof] : that is, not what you wanted. *)
多态变体实际上是一个比这个例子所暗示的更复杂的特征,但我不认为深入细节将有助于回答你的问题。