多态是面向对象的核心特性。一说ADA即使95也没有很好地支持多态性。这可能并不是其一个显著缺陷,而是设计者认为多态性不一定能在ADA语言的通常应用模式中能很好地发挥。但毕竟多态性是很重要的一种属性。好在2005版本做了一些改进,其关键是引入了class-wide类型,即在基类上调'Class记号(Attribute)产生的类型。由于ADA主张常用静态的对象,所以这种情形下的多态看上去有点奇怪;另一方面多态往往和指针引用有很大关系,ADA的指针对对象和指针的声明和类型指定都很严格,所以用起来不像其他语言那么方便灵活。

以下示例基本演示这个特性,并一些其他的语言特性和编程要点:

1. 首先是定义基类的包的声明(person.ads),注意:

- ADA的语言特征是以包作为标识对象(数据+操作)封装的单位,因此以下的这个基类person.object,不应将person像在其他面向对象语言中那样看成名空间,而应当看作这种封装概念的一部分;

- ADA一个数据封装单位即record或者是完全可见的(相当于在public)或是定义在private区域中成为完全不可见的。

package person istype 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 taggedrecordname   : string(1..10);gender : gender_type;end record;end person;

2. 其次是其实现(person.adb),这其中定义了3个方法(数据单位以首参数出现),分别负责设置名字,性别和打印,最新ADA支持这些方法以数据单位的成员形式调用。这里的打印方法将要被用来测试多态性。

with Ada.Text_IO;package body person isprocedure set_name (o : in out object; name : string) isbegino.name := name;end;procedure set_gender (o : in out object; gender : gender_type) isbegino.gender := gender;end;procedure put(o : in object) isbeginAda.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. 再是子类的声明(programmer.ads),可见其中的object(同名无妨,而用package名区分,再次说明package是表征对象的标识)指明继承person.object。这里还显示了一个嵌套定义特性(ADA类似PASCAL语言,可以在任意可定义的位置嵌套定义各种程序内容);枚举(enumeration)和C/C++一样,语法上类似不将类型名作为限定符的常量,所以要避免污染,比如这里的第一个元素adabyron,如果定义成ada,就会影响其后的ada.containers...的编译。

with person;
with Ada.Containers.Ordered_Sets;package programmer is-- extends object in original package to what it is as a programmertype object is new person.object with private;-- nested package for putting languages and related functions togetherpackage languages istype 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 caseprocedure put (o : in object);privatetype object is new person.object withrecordskilled_in : languages.sets.set;end record;end programmer;

4. 子类实现(programmer.adb),这里的put事实上重载了基类的对应方法(在上述声明中可用overriding标识,ADA 2005特性)。由于ADA是将对象数据作为第一参数的,所以不存在this指针,只需要对这个第一参数进行操作即可。而如果要调用基类方法,则只要显示地到基类的包里去找那个方法即可,而当前类型的对象数据要转换成基类对象数据(被称作视图转换,view conversion,没有额外开销)填入到其第一参数中去。这里也演示了Ada库中的Set的用法,这里的Cursor只能显式使用了。具体的原理目前还不很清楚。

with Ada.Text_IO;package body programmer isprocedure set_skills (o : in out object; langs : languages.sets.set) isbegino.skilled_in := langs;end set_skills;procedure add_skill (o : in out object; lang : languages.name) isbegino.skilled_in.Insert(lang);end add_skill;procedure put (o : in object) islang : languages.name;lang_cur : languages.sets.Cursor;begin-- make a view conversion to base type and put itperson.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) looplang := 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方法,有直接调用,也有用class-wide体现多态调用,也有用class-wide的指针进行多态调用,以及class-wide作为函数参数的多态调用。

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;
beginsomeone.set_name("Minnie    ");someone.set_gender(person.female);someone.put;me.set_name("Lincoln   ");me.set_gender(person.male);declare  -- for language loadinguse programmer.languages;beginlangs.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 variablesstype person_access is access all person.object'Class;perclass : person.object'Class := me;peracc : person_access;procedure display(o : person.object'Class) isbegino.put;end display;beginperclass.put; -- use pre-assigned class-wide-type objectperacc := me'Access;peracc.put;   -- set a class-wide-type pointer to an object of child typeperacc := someone'Access;peracc.put;   -- set the point to an object of base typedisplay(me);  -- pass an object to a method with class-wide-type parameterend;end Main;

输出结果

Minnie     is a FEMALE
Lincoln    is a MALE
 who is skilled in ADABYRON BASIC C COBOL CPLUSPLUS CSHARP DELPHI JAVA JAVASCRIPT PASCAL
Lincoln    is a MALE
 who is skilled in ADABYRON BASIC C COBOL CPLUSPLUS CSHARP DELPHI JAVA JAVASCRIPT PASCAL
Lincoln    is a MALE
 who is skilled in ADABYRON BASIC C COBOL CPLUSPLUS CSHARP DELPHI JAVA JAVASCRIPT PASCAL
Minnie     is a FEMALE
Lincoln    is a MALE
 who is skilled in ADABYRON BASIC C COBOL CPLUSPLUS CSHARP DELPHI JAVA JAVASCRIPT PASCAL

ADA程序实例(面向对象特性之多态)相关推荐

  1. C++面向对象特性之多态

    一种对象为了接口重用而呈现的多重形态 静态多态有模板重载,根据不同的参数调用函数体不同,这是在编译是就确定的 动态多态有父子类中的虚函数,父类的指针或者引用调用的虚函数如果进行了重写则会调用子类的虚函 ...

  2. Java基础:面向对象特性(多态)

    多态 多态表示事物的多种表现形态.在程序中,父类通常描述的是多个子类的共性,子类对象就可以作为一个有个性的父类出现,例如狗类可以作为动物类使用,猫类也可以作为动物来使用. 多态的表现需要在两个类存在继 ...

  3. C++ 面向对象程序三大特性之 多态

    目录 多态的概念 多态的定义及使用 虚函数 虚函数的重写 虚函数重写的两个例外 C++11中 override 和 final 重载.重写.隐藏的区别与联系 抽象类 多态的原理 虚函数指针.虚函数.虚 ...

  4. Java学习笔记二十五:Java面向对象的三大特性之多态

    Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...

  5. 面向对象的三大特性之多态

    面向对象的三大特性之多态 文章目录 面向对象的三大特性之多态 前言 一.静态多态 1.函数重载 2.函数模板 二.动态多态 1.函数重写 2.虚函数的继承特性 三.重定义 前言 多态的简单定义为同一种 ...

  6. 多态 在游戏程序实例

    在面向对象的程序设计中,使用多态能够增强程序的可扩充性,即程序需要修改或增加功能时,只需改动或增加较少的代码.此外,使用多态也能起到精简代码的作用.本节通过两个实例来说明多态的作用. 游戏程序实例 游 ...

  7. C++多态的好处和作用(游戏程序实例)

    http://c.biancheng.net/view/265.html 在面向对象的程序设计中,使用多态能够增强程序的可扩充性,即程序需要修改或增加功能时,只需改动或增加较少的代码.此外,使用多态也 ...

  8. polymorphism java_Java基础-面向对象第三大特性之多态(polymorphism)

    Java基础-面向对象第三大特性之多态(polymorphism) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 多态是继封装,继承之后,面向对象的第三大特性,多态的 ...

  9. 黑马程序员 封装特性之继承和多态

    ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...

  10. javascript 的面向对象特性参考

    最近在看用javascript+css实现rich client.javascript 也是一个蛮有意思的语言.特别是其面向对象的实现和其他"标准"的OO launguage有很大 ...

最新文章

  1. 《VMware vCAT权威指南:成功构建云环境的核心技术和方法》一3.6 vCloud计量
  2. 40种Lightbox效果收集
  3. QT的QScriptValueIterator类的使用
  4. python迭代法求解非线性方程_荐【数学知识】非线性方程求解的二分法以及牛顿迭代法...
  5. 处理Akka应用程序中的每个事件
  6. TCP选项:TCP_NODELAY和TCP_CORK
  7. 论文浅尝 - ACL2020 | 利用常识知识图对会话流进行显式建模
  8. GRUB与Linux系统修复(第二版)
  9. Veeam 9.5U3集中管理Agent详解
  10. Ubuntu 10不能通过改source.list装JDK 1.6
  11. 转化cad_PDF一键转CAD
  12. Jmeter(三十八)while控制器实现ssh三次重连
  13. pandownload 替代品_Pandownload倒下了,找一款替代品
  14. 【matlab】iir滤波器
  15. 为什么使用工作流引擎,什么是工作流引擎,工作流引擎选型以及如何使用
  16. Office Word 之画肘形箭头
  17. remap_pfn_range()详解
  18. 每日学习-Java基础(十)接口和继承10(内部类)
  19. 如何做好一个中小型企业计算机网络管理员
  20. python机器学习初探

热门文章

  1. CodeForces 1457C Bouncing Ball
  2. python爬虫基础详细教程
  3. 一个屌丝程序猿的人生(七十五)
  4. Java POI 设置字体下划线、方框打勾、字体加粗
  5. Android中的占位符
  6. C#实现等差与等比数列求和
  7. 百度云智峰会 百度天像打造多媒体新生态
  8. 虚幻引擎4初探(UE4)
  9. 初来乍到,多多关照。
  10. php --enable-maintainer-zts,我的PHP编译日志