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

  一、抽象类与接口的异同

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

 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编程理解之接口(一)接口与类的异同及接口的声明和实现

 

                                                         

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

上一篇:C# 控制台应用 实现 2048游戏


下一篇:AcWing 247. 亚特兰蒂斯 题解