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  更新时间:

posted on   滔Roy  阅读(658)  评论(0编辑  收藏  举报

编辑推荐:
· 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月简报

导航

点击右上角即可分享
微信分享提示