欧意交易所资讯

uncategorized
首页 > 欧意交易所资讯 > 正文内容

深入解析ADA语言中的多态性:从2005版本改进到Class-Wide类型

qer1238个月前 (03-08)欧意交易所资讯299

多态性是面向对象的核心特征。据说,即使95岁也不支持ADA,也不支持多态性。这可能不是一个重大缺陷,但设计师认为,多态性可能不一定能够在ADA语言的通常应用模式中很好地发挥作用。但是毕竟,多态性是非常重要的属性。幸运的是,2005年的版本已经进行了一些改进,关键是引入整个类型的类型,即“类Token()生成的类型”在基类中提出。由于ADA倡导静态对象的共同使用,因此在这种情况下,多态性看起来有些奇怪。另一方面,多态性通常与指针参考有很大关系。 ADA的指针声明和对象和指针的类型规格非常严格,因此它不像其他语言那样方便和灵活。

以下示例基本上说明了此功能,以及其他一些语言功能和编程点:

1。第一个是定义基类包装的声明(.ADS)。笔记:

- ADA的语言功能是,它使用软件包作为对象的封装单位(数据 +操作),因此不应像其他面向对象的语言那样将以下基类视为命名空间,而应作为此封装概念的一部分;

-ADA数据封装单元要么完全可见(等效于),要么在完全看不见的区域中定义。

package person is
  type gender_type is (female, male);
  type object is tagged private;
  
  procedure set_name (o : in out object; name : string);
  procedure set_gender (o : in out object; gender : gender_type);
  procedure put(o : in object);
private
  -- private region
  -- encapsulated object data (tagged as it's object oriented)
    type object is tagged
    record
      name   : string(1..10);
      gender : gender_type;
    end record;
end person;

2。第二个是其实现(.ADB),该实现(.ADB)定义了3种方法(数据单元出现在第一个参数中),该方法分别负责设置名称,性别和打印。最新的ADA支持这些方法被称为数据单位成员。这里的打印方法将用于测试多态性。

with Ada.Text_IO;
package body person is
  procedure set_name (o : in out object; name : string) is
  begin
    o.name := name;
  end;
  procedure set_gender (o : in out object; gender : gender_type) is
  begin
    o.gender := gender;
  end;
  procedure put(o : in object) is
  begin
    Ada.Text_IO.Put(o.name);
    Ada.Text_IO.Put(" is a ");
    Ada.Text_IO.Put_Line(Gender_Type'Image(o.gender));
  end put;
end person;

3。然后是子类(.ADS)的声明,其中表明(同名是可以的,但是用名称进行区别,这意味着代表对象的标识符表示继承。这里还显示了嵌套定义功能(ADA类似于一种语言,该语言可以在任何可定义的位置嵌套并定义各种程序内容);枚举()在语法上与C/C ++相似,C/C ++不使用类型名称作为常数,因此有必要避免污染。例如,如果此处的第一个元素定义为ADA,则将影响随后的ADA的汇编。

with person;
with Ada.Containers.Ordered_Sets;
package programmer is
  -- extends object in original package to what it is as a programmer
  type object is new person.object with private;
  -- nested package for putting languages and related functions together
  package languages is
    type name is (adabyron, algol, basic, c, cobol, cplusplus, csharp,
                  delphi, fortran, java, javascript, lisp, pascal,
                  perl, prolog, python, ruby);
    package sets is new Ada.Containers.Ordered_Sets(languages.name);
  end languages;
  procedure set_skills (o : in out object; langs : languages.sets.set);
  procedure add_skill (o : in out object; lang : languages.name);
  overriding    -- optional, new in Ada 2005; the same when omitted in this case
  procedure put (o : in object);
private
  type object is new person.object with
    record
      skilled_in : languages.sets.set;
    end record;
end programmer;

4。子类实现(.ADB),其中将基准类的相应方法实际上过载(可以在上述声明中标识,ADA 2005功能)。由于ADA将对象数据作为第一个参数,因此没有此指针,只有第一个参数才需要操作。如果要调用基类方法,只需在基类软件包中显示它并找到该方法,并且必须将当前类型的对象数据转换为基类对象数据(称为视图转换,视图,无额外的开销),然后填充其第一个参数。这也证明了ADA库中集合的用法,只能明确使用。具体原则还不是很清楚。

with Ada.Text_IO;
package body programmer is
  procedure set_skills (o : in out object; langs : languages.sets.set) is
  begin
    o.skilled_in := langs;
  end set_skills;
  procedure add_skill (o : in out object; lang : languages.name) is
  begin
    o.skilled_in.Insert(lang);
  end add_skill;
  procedure put (o : in object) is
    lang : languages.name;
    lang_cur : languages.sets.Cursor;
  begin
    -- make a view conversion to base type and put it
    person.put(person.object(o));
    Ada.Text_IO.Put(" who is skilled in ");
    lang_cur := languages.sets.First(o.skilled_in);
    while languages.sets.Has_Element(lang_cur) loop
      lang := languages.sets.element(lang_cur);
      Ada.Text_IO.Put(languages.name'Image(lang));
      Ada.Text_IO.Put(" ");
      lang_cur := languages.sets.Next(lang_cur);
    end loop;
    Ada.Text_IO.Put_Line("");
  end put;
end programmer;

5。最后,有主要程序。在这里,两个对象是静态制作的,即基类和派生类,为它们填写数据,然后以各种方式调用其PUT方法。有直接的呼叫,有些使用整个课程来反映多态性呼叫,有些使用全班范围的指针执行多态性调用,而整个类作为功能参数。

with person;
with programmer;
procedure Main is
  -- these two objects need to be declared aliased to be able to be
  -- referenced by local access objects (ADA pointers)
  someone : aliased person.object;
  me : aliased programmer.object;
  langs :  programmer.languages.sets.Set;
begin
  someone.set_name("Minnie    ");
  someone.set_gender(person.female);
  someone.put;
  me.set_name("Lincoln   ");
  me.set_gender(person.male);
  declare	-- for language loading
    use programmer.languages;
  begin
    langs.Insert(adabyron);
    langs.Insert(basic);
    langs.Insert(cobol);
    langs.Insert(c);
    langs.Insert(cplusplus);
    langs.Insert(csharp);
    me.set_skills(langs);
    me.add_skill(pascal);
    me.add_skill(javascript);
    me.add_skill(delphi);
    me.add_skill(java);
  end;
  me.put;
  declare
    -- access type to class-wide type for person family
    -- it has to be declared locally to be able to reference local variabless
    type person_access is access all person.object'Class;
    perclass : person.object'Class := me;
    peracc : person_access;
    procedure display(o : person.object'Class) is
    begin
      o.put;
    end display;
  begin
    perclass.put; -- use pre-assigned class-wide-type object
    peracc := me'Access;
    peracc.put;   -- set a class-wide-type pointer to an object of child type
    peracc := someone'Access;
    peracc.put;   -- set the point to an object of base type
    display(me);  -- pass an object to a method with class-wide-type parameter
  end;
end Main;

输出结果

是一个

是男性

谁在基本C Cobol Java中

是男性

谁在基本C Cobol Java中

是男性

谁在基本C Cobol Java中

是一个

是男性

谁在基本C Cobol Java中

扫描二维码推送至手机访问。

版权声明:本文由本站发布,如需转载请注明出处。

转载请注明出处https://www.juxingsy.com/post/2480.html

标签: ADA
分享给朋友:

相关文章

智能合约的创造与传统合约流程详解:从撰拟到签署的全面解析

()是普通人日常生活中绕不开的一部分。你可能不太关注劳动合同、一般商品交易等,但事实是你生活中的任何交易都是有合同支撑的。合同是一切商业交易的凭证。 图片.png 要了解智能合约是如何创建的,您必须...

马斯克炒作狗狗币致其暴涨 30%,背后原因竟是这样

马斯克炒作狗狗币致其暴涨 30%,背后原因竟是这样

马斯克又开始炒虚拟货币了! 出品|金融世界 作者 |邓惠龙 狗狗币飙升 30% 当地时间4月3日,加密货币市场上狗狗币的价格突然开始大幅上涨,从约0.07美元/枚涨至约0.1美元/枚,涨幅高达3...

2023年虚拟货币交易平台排行榜:Coinbase等安全可靠的数字货币交易平台推荐

2023年虚拟货币交易平台排行榜:Coinbase等安全可靠的数字货币交易平台推荐

虚拟货币,也称为数字货币,是指基于区块链技术的一种新形式的货币。随着区块链技术的发展和数字货币市场的扩展,越来越多的投资者和贸易商开始关注并参与虚拟货币交易。为了满足市场需求,许多虚拟货币交易平台已经...

比特币交易所竞争激烈,欧易OKEX、ZGYE椰子凭优势获信任

比特币交易所竞争激烈,欧易OKEX、ZGYE椰子凭优势获信任

1. OKEX OKEX目前覆盖全球200多个国家和地区,注册用户超过2000万。 OKEX的使命是通过区块链技术打造公平、透明、安全的金融服务生态系统,让区块链技术真正赋能金融服务,为全球用户提供便...

个人防护用品CE认证指南:PPE指令详解与安全设备选择

个人防护CE认证(PPE指令): PPE 指令是个人佩戴或持有的任何装置或设备的缩写,用于防止一种或多种健康和安全危害。主要用于保护员工免受因接触化学辐射、电气设备、人体设备、机械设备或在一些危险工...

如何在欧意官网安全下载官方APP进行便捷数字资产交易

欧意是一个知名的数字资产交易平台,它的官方 app 能够给我们带来便捷的数字交易体验。通过在官网下载 app,我们就可以不受时间和地点的限制参与到交易当中。接下来,让我们来了解一下相关的内容。 官网识...

加入欧意交易所,探索元宇宙世界!

探索DeFi,DApps, NFTs 和GameFi的世界,和OKX一起创造未来!