一、抽象类与接口的异同

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

 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. 基于EFCore3.0+Dapper 封装Repository

    Wei.Repository 基于EFCore3.0+Dapper 封装Repository,实现UnitOfWork,提供基本的CURD操作,可直接注入泛型Repository,也可以继承Repos ...

  2. 【转】IEnumerable接口的一个简单示例

    转:https://blog.csdn.net/wang371756299/article/details/8197075 摘要: IEnumerable接口是实现foreach循环的一个重要的接口, ...

  3. python接口自动化-requests-toolbelt处理multipart/form-data

    1.requests-toolbelt官方文档:https://pypi.org/project/requests-toolbelt/ 2.环境安装 pip install requests-tool ...

  4. the import javax.jms cannot be resolved问题

    JDK中并没有javax.jms包,你需要一个JMS实现(比如:activemq),并确认相应的jar被包含在CLASSPATH中. http://activemq.apache.org/ 5.5.0 ...

  5. idea软件操作

    1.快捷键: 1.1.格式化代码:crtl+alt+L 1.2.一些构造啊,setter/getter等方法:alt+insert 1.3.crtl + f 搜素当前页面

  6. Vue快速认识

    1.Vue入门初识 1.1 Vue.js是什么? 一位华裔前Google工程师(尤雨溪)开发的前端js库 作用: 动态构建用户界面 特点: 遵循MVVM模式 编码简洁, 体积小, 运行效率高, 移动/ ...

  7. Linux C/C++ 字符串逆序

    /*字符串逆序*/ #include <stdio.h> #include <string.h> void nixu(char *str) { ; char tmp; for( ...

  8. mybatis大于等于小于等于的写法

    第一种写法(1): 原符号 < <= > >= & ' " 替换符号 < <= > >= & &apos; " ...

  9. vs2019清空输入缓冲区

    发现用cin.sync()在vs2019中不能清空输入缓冲区,以前的vs版本没试过,我看别人在vc中用cin.sync()可以清除,估计是IDE的问题..以下是我学习C++四个多月写的一整段代码 运行 ...

  10. 2019-08-13 纪中NOIP模拟B组

    T1 [JZOJ1534] rank 题目描述 小h和小R正在看之前的期末&三校联考成绩,小R看完成绩之后很伤心,共有n个学生,第i个学生有一个总成绩Xi,因为他的排名是倒数第k个,于是小R想 ...