Delphi 系统[25]关键字和保留字 override、overload、reintroduce、inherited
Delphi 系统[25]关键字和保留字 override、overload、reintroduce、inherited
1、定义:
- override :指示子类覆写父类的一个 virtual 或 dynamic 方法。覆盖时必须沿用被覆盖方法的声明,并且不允许修改原方法的参数和返回类型。
- overload :指示重载一个同名函数、过程或方法。重载的同名方法时,必须具备“参数、类型或顺序不同”的条件。调用重载方法时,根据输入的参数不同来调用不同的重载方法。
- reintroduce :指示重新发布父类的方法。如果要覆盖的方法是静态方法,或是需要修改方法的参数等,必须用 reintroduce 进行重发布。对于 virtual 或dynamic 方法,可以直接用 override 进行覆盖。
- inherited :调用父类的方法。
2、示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | { override 覆写父类的方法 } type { 父类定义三个方法,其中两个可以被覆写,一个抽象方法 } TMyObjectA = class (TObject) protected procedure Test1; virtual; {virtual 定义虚方法} public function Test2: string ; dynamic; abstract; {dynamic 定义动态方法 + abstract 抽象方法} function Test3: Integer ; end ; { 子类继承父类的三个,同时将其中两个改写 } TMyObjectB = class (TMyObjectA) protected procedure Test1; override; {覆写 父类A 的 Test1 } public function Test2: string ; override; {覆写 父类A 的 Test2 } end ; { 父类A - Test1方法1} procedure TMyObjectA . Test1; begin ShowMessage( 'A' ); end ; { 父类A - Test2 方法2 } { abstract 抽象方法只定义,不实现 } { 父类A - Test3 方法3 } function TMyObjectA . Test3: Integer ; begin Result := 1 ; end ; { 子类B - 重写方法1 } procedure TMyObjectB . Test1; begin ShowMessage( 'B' ); end ; { 子类B - 重写方法2 这里注意,子类重写了 Test2} function TMyObjectB . Test2: string ; begin Result := 'B' ; end ; { 测试--调用各个方法 } procedure TForm1 . Button1Click(Sender: TObject); var MyObjB: TMyObjectB; begin { 测试子类 } MyObjB := TMyObjectB . Create; try MyObjB . Test1; //B Caption := MyObjB . Test2 + IntToStr(MyObjB . Test3); //B1 finally MyObjB . Free; end ; end ; ---------------------------------------------------------------------------------------- { overload 重载函数 } function ShowInfo(Info: Boolean ): string ; overload; begin ShowMessage(BoolToStr(Info, True )); end ; function ShowInfo(Info: Integer ): string ; overload; begin ShowMessage(IntToStr(Info)); end ; function ShowInfo(Info: string ): string ; overload; begin ShowMessage(Info); end ; procedure TForm1 . Button1Click(Sender: TObject); begin ShowInfo( '你好! 滔Roy' ); ShowInfo( 123456 ); ShowInfo( False ); end ; --------------------------------------------------------------------------------------- { reintroduce 重新发布父类的方法 } type TMyObjectA = class { 父类 } procedure Test; end ; TMyObjectB = class (TMyObjectA) { 子类 } procedure Test; reintroduce; end ; TMyObjectC = class (TMyObjectB) { 孙类 } procedure Test(I: Integer ); reintroduce; end ; --------------------------------------------------------------------------------------- {inherited 继承, 调用父类方法 } type TMyObjectA = class (TObject) { 父类 } public procedure Test1; virtual; procedure Test2; virtual; end ; TMyObjectB = class (TMyObjectA) { 子类 } public procedure Test1; override; end ; procedure TMyObjectA . Test1; { 父类 - 虚拟方法1 } begin ShowMessage( '父类方法 1' ); end ; procedure TMyObjectA . Test2; { 父类 - 虚拟方法2 } begin ShowMessage( '父类方法 2' ); end ; procedure TMyObjectB . Test1; { 子类 - 覆写父类方法1 } begin inherited ; { 调用父类方法中的同名方法,即 Test1 } inherited Test2; { 调用父类方法中的 Test2 } ShowMessage( '子类方法 1' ); end ; procedure TForm1 . Button1Click(Sender: TObject); var MyObjB: TMyObjectB; begin MyObjB := TMyObjectB . Create; try MyObjB . Test1; finally MyObjB . Free; end ; end ; |
3、关于 overload 和 reintroduce 的一些使用说明:
可以使用重载指令重新声明方法。在这种情况下,如果重新声明的方法具有与其祖先不同的参数签名,则会重载继承的方法而不隐藏它。在子类中调用该方法将激活与调用中的参数匹配的任何实现。
如果重载虚拟方法,请在子类中重新声明它时使用 reintroduce 指令。例如:
1 2 3 4 5 6 7 8 9 10 11 | type T1 = class (TObject) procedure Test(I: Integer ); overload; virtual; end ; T2 = class (T1) procedure Test(S: string ); reintroduce; overload; end ; ... SomeObject := T2 . Create; SomeObject . Test( 'Hello! TaoRoy' ); // calls T2.Test SomeObject . Test( 9 ); // calls T1.Test |
在一个类中,不能发布具有相同名称的多个重载方法。运行时类型信息的维护要求每个已发布成员具有唯一的名称。
1 2 3 4 5 | type TSomeClass = class published function Func(P: Integer ): Integer ; function Func(P: Boolean ): Integer //错误的X error |
不能重载用作属性读或写说明符的方法。
重载方法的实现必须重复类声明中的参数列表。有关重载的更多信息,请参阅重载过程和函数。
reintroduce 指令禁止编译器发出关于隐藏以前声明的虚拟方法的警告。例如:
1 | procedure DoSomething; reintroduce; //祖先类还有一个DoSomething方法 |
如果要用新方法隐藏继承的虚拟方法,请使用reintroduce。
创建时间:2021.08.16 更新时间:
博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你有所帮助,谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报