一、抽象类与接口的异同

    接口简单的理解可认为是一个抽象类,我们先定义一个抽象类和接口来对比之间的异同,代码如下:

 type
IFormattedNumber = interface //定义接口
function FormattedString: string;
end; TFormattedNumber = class //定义抽象类
public
function FormattedString: string; virtual; abstract;
end;                

  上面定义了一个接口IFormattedNumber和抽象类TFormattedNumber,从delphi方法上来说,都不能直接实例化,接口是通过类来实现的,而抽象类则是通过其派生类来实现其具体的功能。抽象类与接口的不同我理解有以下几点:

  (一)、接口通过Interface关键字定义,而类则通过Class关键字定义,接口以“I”前缀命名,抽象类则“T”前缀命名;

  (二)、接口直接或者间接派生自IUnKnown,而类则派生自TObject;

  (三)、接口不能直接范围,只能是public,但不要声明;

   (四)、接口不能声明变量,只能包含函数或者过程;

  (五)、接口声明的函数和过程从概念上讲是virtual类型,但不能直接使用virtual关键。 

  接口定义好后就不要修改,如果需要修改,一般的做法是定义新接口,这种做法的目的是保证调用者因为修改接口,而修改调用程序。如果需要增加功能,可以直接从父接口直接派生,如为IFormattedNumber增加SetValue(AValue:Integer)过程我们可以以下代码实现声明:

type
IFormattedNumber2 = Interface(IFormattedNumber)
procedure SetValue(AValue);
end;

  二、接口的声明和实现   

  接口声明和实现很简单,请看下面代码:

unit Unit2;

interface

uses
SysUtils; type
IFormattedNumber = interface //接口声明
['{F9E8F5DE-781B-4B5B-B78A-0F88CF50E53F}'] {GUID,Alt+Shift+G快捷键生成}
function FormattedInteger: string;
end;
TFormattedNumber=class(TObject,IFormattedNumber) //实现接口类
private
FValue:Integer;
public
constructor Create(AValue:Integer);
destructor destroy;override;
function FormattedInteger: string; //实现接口函数FormattedInteger;
end; implementation
constructor TFormattedNumber.Create(AValue:Integer);
begin
inherited Create;
FValue:=AValue;
end;
destructor TFormattedNumber.destroy;
begin
inherited destroy;
end;
function TFormattedNumber.FormattedInteger:string;
begin
Result:=IntToStr(FValue);
end; end.

  接口只是声明功能的地方,具体由类来实现的,到这里我们理解"接口简单的理解可认为是一个抽象类"这句话了吧!以上代码delphi编译会提示下面错误,至于原因我们在下一节进行学习理解。

                                                         

深入delphi编程理解之接口(一)接口与类的异同及接口的声明和实现的更多相关文章

  1. DevOps运动的缘起 将DevOps想象为一种编程语言里面的一个接口,而SRE类实现了这个接口

     SRE vs DevOps:是敌是友? - DockOne.io http://www.dockone.io/article/5935   RE vs DevOps:是敌是友? [编者的话]网站可靠 ...

  2. 如何得到一个接口所有的实现类(及子接口)?例如:Eclipse IDE

    (一)Eclipse IDE的做法 它会解析所有的Java文件.Class文件. 技巧:在Eclipse中,选中Interface,按下F4,就可以查看到所有的实现类及子接口. 例如: (二)自己怎么 ...

  3. 深入delphi编程理解之消息(一)WINDOWS原生窗口编写及消息处理过程

    通过以sdk方式编制windows窗口程序,对理解windows消息驱动机制和delphi消息编程有很大的帮助. sdk编制windows窗口程序的步骤: 1.对TWndClass对象进行赋值; 2. ...

  4. 深入delphi编程理解之消息(二)发送消息函数及消息编号、消息结构体的理解

    一.delphi发送消息的函数主要有以下三个: (一).SendMessage函数,其原型如下: function SendMessage( hWnd: HWND; {目标句柄} Msg: UINT; ...

  5. 深入delphi编程理解之消息(六)无窗口单元消息的创建、接受及dispatch模式编程

    一.程序界面 二.程序代码 (一).主界面代码 //========================================================================== ...

  6. 深入delphi编程理解之消息(五)重写(override)dispatch、wndproc方法和Application.OnMessage事件

    dispatch.wndproc是VCL framework在TWinCtronl定义的虚拟方法,下面程序通过重写(override)这两函数拦截WM_LBUTTONDOWN消息,来与Applicat ...

  7. 深入delphi编程理解之消息(四)使用TWMSysCommand结构体的WM_SysCommand消息应用

    通过以下实例拦截窗体WM_SysCommand消息,我们可以获取到很多有趣的数据. 一.程序界面 二.程序代码 unit Unit1; interface uses Windows, Messages ...

  8. 深入delphi编程理解之消息(三)发送消息函数的一般应用实例

    通过对消息函数(SendMessage.PostMessage.Perform)的一般应用,来说明sendmessage.postmessage函数和perform 方法调用方式和结果的区别. 一.程 ...

  9. ArrayList既然继承自AbstractList抽象类,而AbstractList已经实现了List接口,那么ArrayList类为何还要再实现List接口呢?

    https://www.cnblogs.com/bluejavababy/p/4320545.html

随机推荐

  1. Ubuntu WiFi连接问题

    1,先说明下, 这种方式仅针对 RTL8723BE这款无限网卡. 先用 lspci|grep -i net 先用这个命令查询网卡型号, 我的电脑查询结果: 00:19.0 Ethernet contr ...

  2. laravle中常见的数据库加密

    // 1.md5加密 $str=md5('123456'); // 2.base64_decode加密 $str2=base64_encode('123456'); // 2.1 base64_解密 ...

  3. R语言函数化学习笔记6

    R语言函数化学习笔记 1.apply函数 可以让list或者vector的元素依次执行一遍调用的函数,输出的结果是list格式 2.sapply函数 原理和list一样,但是输出的结果是一个向量的形式 ...

  4. SVM-支持向量机(二)非线性SVM分类

    非线性SVM分类 尽管SVM分类器非常高效,并且在很多场景下都非常实用.但是很多数据集并不是可以线性可分的.一个处理非线性数据集的方法是增加更多的特征,例如多项式特征.在某些情况下,这样可以让数据集变 ...

  5. centos 7 源码安装openresty

    Openresty 官网 http://openresty.org Openresty源码下载页面 http://openresty.org/en/download.html Openresty 简易 ...

  6. python接口

    用正则表达式提取数据: https://www.cnblogs.com/dwdw/p/9553192.html python unittest TestCase间共享数据(全局变量的使用): http ...

  7. Linux終端一行命令发送邮件

    近期由于经常需要给别人发送邮件,每次都要打开QQ邮箱觉得非常麻烦.想到Linux终端可以自定义命令,加上python可以实现邮件发送功能,于是自己写了一个终端send + 文件地址的命令. 首先贴上p ...

  8. 详解C/C++中的的:#pragma pack(push) 、#pragma pack(pop) 和#pragma pack()

    前言 我们知道结构体内存对齐字节可以通过#pragma pack(n) 的方式来指定. 但是,有没有想过一个问题,某些时候我想4字节对齐,有些时候我又想1字节或者8字节对齐,那么怎么解决这个问题呢? ...

  9. pikaqiu练习平台(SQL注入 )

    sql注入漏洞 (危害是最大得) Sql注入 数据库注入漏洞,主要是开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击者可以通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执 ...

  10. SQL Server 2008创建数据库

    1.数据.数据库.数据管理系统基本概念: 数据:人类有用信息的符号化表示. 数据库:按照数据结构来组织.存储和管理数据的一个仓库. 数据库管理系统(DBMS):可维护.存储并为应用系统提供数据的软件系 ...