Struct 在不使用判别式的情况下,在Ada中导出记录类型时指定值

Struct 在不使用判别式的情况下,在Ada中导出记录类型时指定值,struct,ada,derived-types,Struct,Ada,Derived Types,我试图在Ada中建模三个实体:Person、Woman和Man。我希望人有一个字段是性别,对于人必须是未知,对于男人必须是男性,对于女人 我想将Man和women实现为Person派生类型,其Gender字段分别为Male和Female 此外,我希望人的性别的唯一允许值是未知,同样地男性和女性的 我尝试了以下方法,但它当然无法编译: package-Persons是 类型性别为(男性、女性、未知); 类型人是私人的; 类型人是私人的; 类型女性是私人的; 函数Get_Age(Self:Perso

我试图在Ada中建模三个实体:
Person
Woman
Man
。我希望
有一个字段是
性别
,对于
必须是
未知
,对于
男人
必须是
男性
,对于
女人

我想将
Man
women
实现为
Person
派生类型,其
Gender
字段分别为
Male
Female

此外,我希望
人的
性别
的唯一允许值是
未知
,同样地
男性
女性

我尝试了以下方法,但它当然无法编译:

package-Persons是
类型性别为(男性、女性、未知);
类型人是私人的;
类型人是私人的;
类型女性是私人的;
函数Get_Age(Self:Person)返回整数;
函数Get_Name(Self:Person)返回字符串;
函数Get_Weight(Self:Person)返回浮动;
函数Get_Height(Self:Person)返回浮动;
函数Get_性别(Self:Person)返回性别;
私有的
类型的人是
记录
年龄:整数:=0;
名称:字符串(1..256):=(其他=>字符'Val(0));--'
高度、重量:浮球:=0.0;
性别:性别:=未知;
结束记录;
类型男子是性别=>男性的新人;
类型女性是性别=>女性的新人;
终端人员;
我不想将
Person
声明为参数类型,因为这样,
Person
将被允许为
男性
女性
未知
,我不想允许这样做

是否可以做我想做的事情?

Ada 2012解决方案:

类型人员被标记为记录
-- ...
性别:性别:=未知;
类型为_不变量=>(Person.Gender=未知)的结束记录;
类型Man是具有空记录的新人
具有类型_不变量=>(Man.Gender=Male);
类型妇女是具有空记录的新人
具有类型_不变量=>(Woman.Gender=Female);
我不确定这是否适用于未标记的类型。

使用普通的Ada 95(除了一些欺骗行为,以避免必须为包裹提供一个主体
男人
女人
):

private with Ada.Strings.Unbounded;
包裹员是
类型年龄(以年为单位)的范围为0。。200;
类型重量(单位:kg)为增量0.1,范围为0.0。。300.0;
类型高度(单位:m)为增量0.01,范围为0.0。。3.0;
性别类型为(男,女);
类型实例被抽象标记为私有;
子类型类是实例“类;”--“类”
函数年龄(自身:实例)返回年龄(单位:年);
函数名(Self:in实例)返回字符串;
功能重量(自身:实例)返回重量(单位:kg);
函数高度(Self:in-Instance)返回高度(单位:m);
功能性(自我:实例)回归性是抽象的;
私有的
类型实例被抽象标记
记录
年龄:以年为单位的年龄;
名称:Ada.Strings.Unbounded.Unbounded_String;
重量:重量单位为千克;
高度:以米为单位的高度;
结束记录;
最终人;
与人;
包裹员是
子类型父项为Person.Instance;
类型实例为空记录的新父级;
子类型类是实例“类;”--“类”
最重要的
功能性别(自我:实例)返回人。性别为(人。男性);
终结者;
与人;
包装女工是
子类型父项为Person.Instance;
类型实例为空记录的新父级;
子类型类是实例“类;”--“类”
最重要的
功能性(自我:实例)返回人。性别为(人。女性);
女主角;

我知道你说没有歧视,但你给出的理由是为了防止他们之间的分配。你愿意考虑把鉴别隐藏在私人类型后面吗?这将阻止客户机代码执行赋值,如果使用类型派生,将防止在包的内部代码中意外地赋值。下面是两个不同的示例,您可以在其中隐藏判别式,从而阻止赋值。编辑:使用泛型添加了第三个选项

过程jdoodle是
包裹人员1是
类型性别为(男性、女性、未知);
类型人是私人的;
类型人是私人的;
类型女性是私人的;
私有的
类型实现(性别:Genders)为
记录
年龄:整数:=0;
名称:字符串(1..256):=(其他=>字符'Val(0));--'
高度、重量:浮球:=0.0;
结束记录;
类型Person是新实现(未知);
类型Man是新实现(男性);
类型女性为新实施者(女性);
最终人员1;
包装人员2是
类型性别为(男性、女性、未知);
类型人是私人的;
类型人是私人的;
类型女性是私人的;
私有的
类型Person(性别:Genders:=未知)为
记录
年龄:整数:=0;
名称:字符串(1..256):=(其他=>字符'Val(0));--'
高度、重量:浮球:=0.0;
结束记录;
类型男子为新人(男性);
类型女性为新人(女性);
终端人员2;
包装人员3是
类型性别为(男性、女性、未知);
类型人是私人的;
类型人是私人的;
类型女性是私人的;
私有的
通用的
性别:性别:=未知;
所有人的包裹都是
类型人是记录
年龄:整数