|
再看“全自动猜数字”这个类,它并没有定义“猜()”这个成员方法,但外界却可以调用它的“猜()”,为什么呢?这是因为“全自动猜数字”的基类是“猜数字”,“猜()”正是从其基类“猜数字”中“继承”而来的。面向对象中“继承”的概念,类似于现实生活中子女继承父辈的财产。子类只能继承基类中“公开”和“扩展”的成员,而不能继承“私有”成员。 逆风编程技术
“多态”的概念就更复杂一些,更难理解,也更难解释。通俗的说,就是根据对象的实际类型(而非变量的类型)动态地(程序运行时,而非编译时)决定应该调用的成员方法。多态机制通常依赖于继承和覆盖(子类定义“与其父类‘公开或扩展的成员方法’声明形式相同的”成员方法,子类中的方法将覆盖基类中的方法)。
下面根据这几句代码具体讲解一下:
猜数字 猜 = 创建 猜数字(); //猜数字 猜 = 创建 全自动猜数字(); 猜.猜();
把第二行注释起来仅执行第一行,与把第一行注释起来仅执行第二行,程序有截然不同的运行结果,其中的主要“秘密”就在于多态机制。而在本程序中,多态机制主要体现在“获取数字()”这个成员方法上——它是一个“扩展”方法,可以被覆盖,也已经被覆盖(基类“猜数字”中定义了一个“获取数字()”,子类“全自动猜数字”中也定义了一个“获取数字()”,后者覆盖前者)。程序之所以会出现两个运行结果,也正是因为有两个“获取数字()”,至于哪个“获取数字()”被执行,取决于对象的真实类型(创建时确定,且永不改变):如果对象的类型是“猜数字”(第一行),那么“猜数字.获取数字()”被调用;如果对象的类型是“全自动猜数字”(第二行),那么“全自动猜数字.获取数字()”被调用。您可能还在疑惑,这两个类只有一个“猜()”方法啊,定义于基类“猜数字”中的“猜()”方法能够调用到子类“全自动猜数字”中的“获取数字()”方法吗?可以的,因为子类的“获取数字()”覆盖了基类的“获取数字()”。这是多态的精髓,也是最难理解之处。
面向对象的思想不是很快就可以领会和掌握的,需要细致的品味和长期的实践。面向对象是一门科学。许多人一辈子都在学习。
第 8 分钟:特色语法
友好名称——用类自然语言格式书写程序:
如果定义了如下友好名称:
友好名称 将<某>写到屏幕 = 控制台.输出行(某);
那么程序可以这么写:
'将123写到屏幕上'; '将"易语言"写到屏幕上'; '将<x>写到屏幕上'(x=100.123);
三联判断式:
可以这么写“如果(0 < x < 10)”,而不必象C/C++,Java,C#那样必需写成“if(x > 0 && x < 10)”。“0 < x < 10”,数学中最通用的写法,多自然呀,为什么其它编程语言就是不支持呢?我想所有程序员学数学都早于学编程,一开始看到怪怪的“x > 0 && x < 10”,必然有此疑问,可是各编程语言设计大师就是对此视而不见!
方法多返回值:
定义一个具有多返回值的方法:
文本,整数 取姓名和年龄() { 返回("中国", 5000); }
调用以上方法,接收多返回值:
文本 姓名; 整数 年龄;
(姓名,年龄) = 取姓名和年龄();
双向赋值运算符“<=>”——交换两个变量的值:
整数 a = 1, b = 2; a <=> b; //执行后,a的值为2,b的值为1;
如果没有双向赋值运算符,大概要写成“c = a; a = b; b = c;”或“a = a + b; b = a - b; a = a - b;”或“a = a ^ b; b = a ^ b; a = a ^ b;”,多麻烦啊。
测试版1.1.0又引入了一些非常有用的语法特性,如“遍历循环”“参数默认值/扩展参数”“嵌入类型/嵌入方法”“中英文双语关键字”“通用型”等。关于“中英文双语关键字”,本人也曾专门写过一文:考考你,能看出这一段代码是用哪个编程语言写的吗?。
第 9 分钟:答题时间
有了易语言,为什么还要重新搞“易语言.飞扬”?
官方有回答,请看这里:http://www.dotef.cn/faq.html
“易语言.飞扬”跟原易语言比,有哪些本质改进?
完全面向对象、自动垃圾回收、可自行开发类库、与C/C++等语言水乳交融、纯文本源代码、支持Unicode……
已经有很多编程语言了,我们还需要一个全新的编程语言吗?
汇编语言诞生时,C语言诞生时,C++诞生时,Pascal诞生时,Java诞生时,C#诞生时,都会有相同的疑问,答案都是一个:“需要”。 “易语言.飞扬”也一样。
“与C/C++语言等水乳交融”体现在哪里?
可以使用C/C++等语言开发易语言本地类库,和易语言自身开发的类库完全等效,可相互引用,融合互补。
“易语言.飞扬”在哪些方面跟Java比较相似?
语法方面基本照抄;面向对象方面基本照抄;都有自动垃圾回收机制;都有“引用”的概念,都没有“指针”的概念;都可以跨平台;都有自已的类库;都支持Unicode、多线程、类反射;都有类似“Class Path”“Java Doc”“JNI”等东东……
为什么跟Java这么像?
语法方面没得说,两者都抄C语言;其它方面,我觉得“易语言.飞扬”向目前最先进的编程理念靠拢是正常的,也是合理的。
哪些方面跟Java不同?
编译型语言,直接执行机器码,运行效率高(Java是由JVM解释执行字节码,配合JIT);最精巧的运行时环境(Runtime Environment);以“类库”而非“包(package)”为单位引入(import);对源代码文件的路径没有严格要求(Java要求源文件必须位于特定子目录中,与package一致);不限制一个源代码文件只能写一个公开类;类的构造方法固定为“初始化()”,析构方法固定为“清理()”(Java类的构造方法名称与类名称相同,没有析构函数);暂时不支持异常处理机制;前面提到的特色语法;
本文章更多内容:<<上一页 - 1 - 2 - 3 - 4 - 下一页>> |