overridden/inherited关键字的读书笔记
虚拟方法和动态方法不同于静态方法,它们可以在其后裔类中被覆盖(overridden),即只有一个方法所在类的祖先类对应的方法是virtual或dynamic的,这个当前类的方法才可以用overide覆盖。当一个覆盖方法被调用时,方法调用中使用的类或对象的实际(运行时)类型决定了哪一个实现是有效的,而非变量声明的类型决定。virtual方法是可以有实现的部分的,也可是在后裔类中override。
abstract抽象方法是那些在类中声明但未实现的虚拟方法或动态方法。抽象方法的实现推延到后裔类中。声明抽象方法必需在指示字virtual或dynamic之后使用abstract。例如:procedure DoSomething; virtual; abstract; 即abstract方法是没有实现的,实现推延到后裔类中,后裔override这个方法后可以有实现部分。
如果:
TBaseObj=class
public
procedure AMethod;
end;
TChildObj=class(TBaseObj)
procedure AMethod;
end;
{ TBaseObj }
procedure TBaseObj.AMethod(str:string);
begin
showmessage('TBaseObj.AMethod;');
end;
{ TObj }
procedure TChildObj.AMethod(str:string);
begin
showmessage('TChildObj.AMethod;');
end;
实际上两个类的AMethod方法无任何关系。子类中将看不到祖先类的AMethod方法,而只有自已的AMethod方法,运行下面事件过程将执行
showmessage('TChildObj.AMethod;');
procedure TForm1.Button2Click(Sender: TObject);
var
childobj:TChildObj;
begin
childobj:=TChildObj.Create;
childobj.AMethod;
end;
如果
TBaseObj=class
public
procedure AMethod(str:string;i:integer=0);virtual;
end;
TChildObj=class(TBaseObj)
procedure AMethod(str:string);
end;
pprocedure TBaseObj.AMethod(str:string;i:integer=0);
begin
showmessage('Base'+str);
end;
{ TObj }
procedure TChildObj.AMethod(str:string;i:integer=0);
begin
showmessage('Child'+str);
end;
执行下面事件过程,将看到showmessage中显示'ChildAMethod;' 并有[Warning] Unit1.pas(28): Method 'AMethod' hides virtual method of base type 'TBaseObj'的编译信息显示,说明在子类没有用override关键字时,声明一个与祖先类同名的方法是会隐藏祖先类的同名方法,执行自已的方法。而在子类方法声明后加reintroduce就不会有编译信息显示。如果使用override,要保证子类与祖先类方法的参数类型,顺序返回值相同,不然会在编译时报错:
因此交上面子类声明改为:procedure AMethod(str:string;i:integer=0);override;,实现部分也要相应更改,这样执行下面事件过程,即子类方法覆盖了祖先类方法最后将看到showmessage中显示'ChildAMethod;' ,如果有多个子类,都override那个virtual的祖先类的方法,那么最后执行结果是子类的这个AMethod方法,覆盖了祖先类同名方法的实现内容。实际上如果祖先类的这个方法是virtual;abstract的结果也是一样的,。即祖先类只定义一个声明,具体实现由这个祖先类的子类们去完成,执行不同子类结果不同,因为各子类的AMethod实现细节都有所不同。
procedure TForm1.Button2Click(Sender: TObject);
var
childobj:TChildObj;
begin
childobj:=TChildObj.Create;
childobj.AMethod('AMethod;');
end;
另一个有用的东西是:inherited关键字,如果将上面的子类方法实现改为:
procedure TChildObj.AMethod(str:string;i:integer=0);
begin
inherited;
showmessage('Child'+str);
end;
然后再运行Button2Click,则会先看到showmessage出BaseAMethod,再看到showmessage出ChildAMethod。为什么会有这种现象呢,看一下关于inherited的说明:
保留字inherited在实现多种行为中扮演特殊的角色。它可以出现在方法定义中,在其后面可以有或没有标识符。
如果inherited之后跟随一个成名名称,那么除了表示在封装了方法的类的直接祖先中搜寻成员之外,还可以表示标准的方法调用或者对属性或域的引用。
也就是说运行到inherited时会告诉当前inherited所在方法中祖先类的同名方法,所以先看到showmessage出BaseAMethod。如果祖先类中有一个abc方法,那么在此也可调用,即 inherited abc,即如果inherited后面没参数,执行时找祖先类同名方法,有参数如abc则在祖先类找那个
abc方法。
转载于:https://www.cnblogs.com/hackpig/archive/2010/02/12/1667968.html
overridden/inherited关键字的读书笔记相关推荐
- c语言字母表关键字,读书笔记-C语言关键字
001 关键字 C语言一共32个关键字 1. 声明和定义 在开始认识关键字前,必须要明白什么是声明,什么事定义: 定义:(编译器)创建一个对象,为这个对象分配一段内存并给他取上一个名字.在一个作用域内 ...
- 读书笔记:《SEO教程:搜索引擎优化入门与进阶》(2)——关键字
关键字的位置和形式 搜索引擎分析网页时,在HTML源代码中是自上而下进行的,因此搜索引擎会更加重视网页源代码中首先出现的内容,因此在规划页面时,应非常重视页面的<head>节点: < ...
- Think in Java第四版 读书笔记9第15章 泛型
Think in Java第四版 读书笔记9第15章 泛型 泛型:适用于很多很多的类型 与其他语言相比 Java的泛型可能有许多局限 但是它还是有很多优点的. 本章介绍java泛型的局限和优势以及ja ...
- .net框架读书笔记---虚方法
接上一篇.net框架读书笔记---引用参数(ref/out), 一.虚方法调用机理 代码 namespace VirtualFunction { class Program { static void ...
- 《你不知道的JavaScript上卷》知识点整理与读书笔记
各位路过的的大佬.求关注.求点赞.谢谢 第一部分 作用域和闭包 第1章 作用域是什么 1.1编译原理 1.2理解作用域 1.3作用域嵌套 1.5异常 第2章 词法作用域 2.1词法阶段 2.2欺骗词法 ...
- 读书笔记:编写高质量代码--web前端开发修炼之道(二:5章)
读书笔记:编写高质量代码--web前端开发修炼之道 这本书看得断断续续,不连贯,笔记也是有些马虎了,想了解这本书内容的童鞋可以借鉴我的这篇笔记,希望对大家有帮助. 笔记有点长,所以分为一,二两个部分: ...
- 《Java: The Complete Reference》等书读书笔记
春节期间读了下<Java: The Complete Reference>发现这本书写的深入浅出,我想一个问题,书中很多内容我们也知道,但是为什么我们就写不出这样一本书,这么全面,这么系统 ...
- 《C#图解教程》读书笔记之四:类和继承
本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.万物之宗:Object (1)除了特殊的Object类,其他所有类都是派生类,即使他们没有显示基类定义. ( ...
- C++ Primer 第三版 读书笔记
1.如果一个变量是在全局定义的,系统会保证给它提供初始化值0.如果变量是局部定义的,或是通过new表达式动态分配的,则系统不会向它提供初始值0 2.一般定义指针最好写成:" string * ...
- [原]《Web前端开发修炼之道》-读书笔记CSS部分
如何组织CSS-分层 应用 css 的能力分两部分:一部分是css的API,重点是如何用css控制页面内元素的样式:另一部分是css框架,重点是如何对 css 进行组织.如何组织 css 可以有多种角 ...
最新文章
- MySQL 5.6中如何定位DDL被阻塞的问题
- 邻接表终极解析===和vector写法的区别
- CoreOS 和 Kubernetes 1.5 自主运行 Kubernetes、Container Linux
- 开源 免费 java CMS - FreeCMS1.2-标签 mailList
- D - Mike and strings
- 快速优雅的为React组件生成文档
- [JavaScript]为JS处理二进制数据提供可能性的WEB API
- 全球及中国航空材料行业发展动态及应用格局展望规划报告2021-2027年版
- python中自定义变量名标识符_name是python的标识符吗
- boost::mpl::integral_c用法的测试程序
- jpa 返回数据转换_如何使用JPA类型转换器加密数据
- 【剑指offer】_14 不用加减乘除做加法
- es的聚合数据的准确性
- 切换输入法快捷键_输入法失灵怎么办?该怎么恢复?
- 用SQL表达内连接和外链接
- [转载] Java之可变参数
- 代码Review那些事
- 看图纸V3.2.1正式版[看图纸正式版下载]
- 【VS插件】VS2012设置透明背景
- 两年工作经验,三面拼多多,最终获得offer!(面经总结)
热门文章
- 递归问题学习二之卡牌组合问题
- 基础知识之什么是I/O
- python列表用来有序存放一组_Python期末习题练习
- mysql数据库d盘_Windows Server 2008 R2下修改MySQL 5.5数据库目录为D盘
- linux 项目文件管理,VS2017开发Linux程序之管理已有的makefile工程
- postman 测试excel下载_使用Postman轻松实现接口数据关联
- matlab中制作软件,2020-02-27 MATLAB App Designer——在 App 设计工具中创建辅助函数
- meta http-equiv(属性详解)
- Scala之flatMap操作
- 删除Linux上的用户