Ada中亚型的非连续范围?

时间:2012-08-31 22:42:26

标签: types visibility ada

完全作为Ada型系统学习练习,我试图制作3种类型(或者更确切地说,类型和2种子类型):

  • Month_Type,所有月份的枚举
  • Short_Month_TypeMonth_Type子类型只有30天的月份
  • February_Month_Type,一个只有二月的子类型

似乎子类型必须使用range机制,对吗? (还有其他类型的子类型吗?)为了让它与连续范围一起工作,我必须按以下顺序放置Month_Type枚举:

   type Month_Type is (February, April, June, September, November, January, March, May, July, August, October, December);

显然这不是几个月的自然顺序,我可以看到人/我试图做Month_Type'First或者期望得到1月的事情。

所以,这个愚蠢的例子中有两个一般性问题:

  1. 我可以指定一个子类型来指定其基本类型的特定组件而不是范围吗?
  2. 我可以以某种方式隐藏我放置月份的订单的实现细节(例如,“首先不可见”)
  3. 谢谢!

4 个答案:

答案 0 :(得分:5)

不,enumeration subtype仅在此上下文中承认range_constraint,但您可以使用Sets创建任意数量的Ada.Containers.Ordered_Sets。有herehere示例。

答案 1 :(得分:5)

您可以创建一个对象,它只指定枚举中的某些值。我们通常称之为“集合”。

许多语言都设置为基本类型(以及数组和记录)。当然有些人没有。阿达有点中间。它不会 offical 具有名为“set”或类型的类型,但boolean的数组上的boolean operations are defined to work like bitwise logical operations。如果你打包数组,你几乎可以得到其他语言的“set”类型给你的东西。所以 Ada确实支持集,它们只是被称为“布尔数组”。

type Month_Set is array (Month) of Boolean;
Short_Month : constant Month_Set := 
    (September => true, April => true, June => true, November => true, 
     February => true, others => false);
Y_Month : constant Month_Set :=
    (January => true, February => true, May => True, July => true, 
     others => false);

-- Inclusion
if (Short_Month(X)) then ...

-- Intersection (Short_Y will include only February)
Short_Y := Short_Month and Month_Ending_in_Y;

-- Union (Short_Y will include All Short_Months and all Y_Months
Short_Y := Short_Month or Month_Ending_in_Y;

-- Negation (Short_Y will include all Short_Months not ending in Y
Shorty_Y := Short_Month and not Month_Ending_in_Y;

答案 2 :(得分:2)

Trashgod回答了第一个问题。 要回答第二个问题,请将类型本身设为私有。

答案 3 :(得分:2)

您可以使用subtype predicates。在你的情况下:

subtype Short_Month_Type is Month_type with
  Static_Predicate => Short_Month_Type in April | June | September | November