Struct 在不使用判别式的情况下,在Ada中导出记录类型时指定值
我试图在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
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是
类型性别为(男性、女性、未知);
类型人是私人的;
类型人是私人的;
类型女性是私人的;
私有的
通用的
性别:性别:=未知;
所有人的包裹都是
类型人是记录
年龄:整数