delphi function或procedure的static;overload;override;abstract;virtual;dynamic;reintroduce;inline;stdcall;message;
function static;overload;override;abstract;virtual;dynamic;inline;stdcall;
procedure static;overload;override;abstract;virtual;dynamic;
static 表示是静态方法;静态方法是方法的默认类型,不能被覆盖override;
Override 覆盖 overload 重载 (两者为Java多态性的不同表现形式)
override 表示是覆盖方法;要求祖先类中必须有该方法的定义,并且参数的顺序和类型
及返值的类型必须匹配;用于功能上扩展祖先类中的该方法而不是取代它(如不调用祖先类中的该方
法则等同于取代);被覆盖的函数必须是虚(virtual )的,或者是动态(dynamic )的,也就是说该函数在声明时应该包含这两个指示字中的一个。virtual 和 dynamic 定义的虚函数,都是为子类override 用的,只不过它们的实现不一样:vitrual 占用的空间大点,但速度快些。dynamci正好相反.。比如:申明时:procedure Draw; virtual或dynamic ; 调用时:procedure Draw; override ;
或者在虚拟类的实例中使用,比如:
Exception = class(TObject)
public
destructor Destroy; override;
function GetBaseException: Exception; virtual;
function ToString: string; override;
overload 表示是重载方法;用于一个类中有许多同名的方法带着不同参数表的情形;
(属性 的读写方法不能被重载);比如:TSingleHelper类方法:
function ToString: string; overload; inline;
function ToString(const AFormatSettings: TFormatSettings): string; overload; inline;
function ToString(const Format: TFloatFormat; const Precision, Digits: Integer): string; overload; inline;
function ToString(const Format: TFloatFormat; const Precision, Digits: Integer;
const AFormatSettings: TFormatSettings): string; overload; inline;
message 表示是消息处理方法;在关键字message后面的值指明了这个方法要响应的消息;用消息处理方法来响应MSWindows的消息,这样就不用直接来调用它;
stdcall 是一种API调用方式,标明了参数入栈stack的顺序和清除的方式:详见响应的操作系统的API说明
abstract 表示是抽象方法;是没有实现的方法,并且必须是virtual 或dynamic 方法,即
在abstract前面必须有virtual 或dynamic 关键字,其实现部分在派生类中;如
procedure DoSomething; virtual ; abstract ; //: 留给派生类类覆盖时重写方法或过程用。
reintroduce 表示是重新声明的方法(在父类中没有的);用于方法的名称与祖先类中的某个方法名称相同的情形; 比如:
TStringBuilder = class
public
function Equals(StringBuilder: TStringBuilder): Boolean; reintroduce;
function ToString(UpdateCapacity: Boolean): string; reintroduce; overload;
function ToString(StartIndex: Integer; StrLength: Integer): string; reintroduce; overload;
再比如:
TStrings = class(TPersistent)
public
function Equals(Strings: TStrings): Boolean; reintroduce;
inline 指编译器在编译时将方法或过程的代码的内联(串联)到调用者,为的是提高执行效率,但带来编译后的体积增加。
关于【inline代码串联(内联)】:应谨慎使用
在函数声明或定义中,函数返回类型前加上关键字inline,即可以把函数指定为内联函数。这样可以解决一些频繁调用的函数大量消耗栈空间(栈内存)的问题。关键字inline必须与函数定义放在一起才能使函数成为内联函数,仅仅将inline放在函数声明前面不起任何作用。inline是一种“用于实现”的关键字,而不是一种“用于声明”的关键字。
为了提高应用程序的性能,可以用inline声明一个函数过过程,对于声明为inline的过程,编译器在编译时,会取代正常的过程调用方式,取而代之是直接把这个函数的编译代码拿过来生成到调用该过程的地方,有多处调用一个函数,都直接在调用处插入函数的编译代码,这样的弊端,会生成较大的EXE文件。
声明的方法:
procedure MyFunc(x:integer):string;inline
有多种情况的函数或过程是不支持inline的:
- 后绑定的方法,如virtual,dynamic,message方法
- 包含汇编的过程
- Contructors与destructors方法
- The main program block, unit initialization, and unit finalization blocks cannot be inlined.
- Routines that are not defined before use cannot be inlined.
- 用开放数组为参数的过程,如:procedure Add(A: array of Integer)
- Package中支持inline,但Packages间不支持
- 交叉引用的Unit间不支持inline,如a,b,c三个unit,a引用b,b引用c,c引用a,则编译时不生成inline代码,编译器在inline代码时,交叉依赖的unit不编译出inline代码,但对于其中引用的unit,还是生成inline代码的,如在上面的例子中,如果A单元也采用了D单元,从单元D的代码可能会被内联,因为它不参与交叉依赖。
- 如果一个过程定义在interface部分,实现代码在implementation部分,则不会inline
- while do 或 repeat until等中使用的过程
关于inline有三个编译条件变量可用:
{$INLINE ON}:支持inline指令,这是默认的
{$INLINE OFF}:关闭inline编译方式,不支持inline
{$INLINE AUTO}:自动支持inline,当inline on 时,对于32byte的过程自动进行inline.