Delphi interface 接口 总结

【Delphi 基础知识 44】接口interface的应用 总结为一句话就是:接口只告诉你要做什么,而类会告诉你应该怎么做下面是最简单的接口实现type['{08FA1638-75C2-4B93-B9C3-5D585FC831ED}'] // CTRL+SHIFT+G IDE会自动生成end;// TInterfacedObject负责接口管理,引用计数等,一般都会有它// IMyInterface上面定义的接口,表明这个类就是要实现该接口的功能publicend;beginend; 阅读详情

接口的功能类似抽象类, 通常定义一套通用的方法,但是在各实现类中有不同的实现方式。

以下几句来源于网络整理:

(1)接口中只有方法、属性,没有字段。所以接口中的属性存取都必须通过方法。

(2)接口中的方法只有声明,没有实现。实现在类中完成。

(3)接口中的方法没有作用域。都是公开的,但是在类中则放到不同作用域。

(4)接口中的方法没有修饰字。可以认为它们都是抽象的。

(5)不能创建接口实例,要使用接口,必须在类中实现,通过类调用接口的方法。

(6)在类中必须声明和实现接口的所有方法。不像类继承中可以选择。

(7)接口中的方法在类中实现时,可以加virtual/dynamic、abstract修饰,从而在子类中可以实现覆盖。

以上内容在下方代码中一一实现(第七条没弄)

开发中经常遇到某某平台的对接什么的,某某消费机对接什么的,其实大致操作流程是差不多的,发送支付请求,发送查询请求,发送退款请求等, 简而言之,接口定义的一套通用的方法.

界面演示截图:

   

工程文件DelphiInterface.dpr代码:

program DelphiInterface;

uses
  Forms,
  uFrmMain in 'uFrmMain.pas' {FrmMain},
  uPayInterface in 'intf\uPayInterface.pas',
  uCloudPay_A in 'public\uCloudPay_A.pas',
  uCloudPay_B in 'public\uCloudPay_B.pas',
  uPay in 'public\uPay.pas';

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TFrmMain, FrmMain);
  Application.Run;
end.

接口单元uPayInterface.pas代码:

unit uPayInterface;

interface

uses
  Windows;

type
  //支付接口  通用的有本地初始化  支付请求  查询请求
  IPay= interface(IInterface)
    ['{F105EA82-976D-4CC8-9315-F3C43055EACF}']     //Ctrl+ Shift+ G 自动生成

    procedure init;                                                //初始化
    function getClassname: string;                                 //获取类名
    function Pay(const sIn: string; out sOut: string): Integer;    //支付
    function Query(const sIn: string; out sOut: string): Integer;  //查询
  end;

implementation

end.

实现类uCloudPay_A.pas代码:

unit uCloudPay_A;

interface

uses
  uPayInterface;

type
  TCloudPay_A= class(TInterfacedObject, IPay)
  private
    procedure init;                                                //初始化
  public
    constructor Create;
    destructor Destroy; override;
    function getClassname: string;                                 //获取类名 
    function Pay(const sIn: string; out sOut: string): Integer;    //支付
    function Query(const sIn: string; out sOut: string): Integer;  //查询
  end;

implementation

{ TCloudPay_A }

constructor TCloudPay_A.Create;
begin
  init; //做一些初始化操作 比如参数读取 或 参数动态创建
end;

destructor TCloudPay_A.Destroy;
begin
  //可能有些参数需要释放
  inherited;
end;

function TCloudPay_A.getClassname: string;
begin
  Result:= 'TCloudPay_A';
end;

procedure TCloudPay_A.init;
begin
  //各支付平台有各子的配置参数 可在这里读取本地配置文件
end;

function TCloudPay_A.Pay(const sIn: string; out sOut: string): Integer;
begin
  //
  Result:= 200;
end;

function TCloudPay_A.Query(const sIn: string; out sOut: string): Integer;
begin
  //
  Result:= 200;
end;

end.

实现类uCloudPay_B.pas代码:

unit uCloudPay_B;

interface

uses
  uPayInterface;

type
  TCloudPay_B= class(TInterfacedObject, IPay)
  private
    procedure init;                                                //初始化
  public
    constructor Create;
    destructor Destroy; override;
    function getClassname: string;                                 //获取类名 
    function Pay(const sIn: string; out sOut: string): Integer;    //支付
    function Query(const sIn: string; out sOut: string): Integer;  //查询
  end;

implementation

{ TWXPay }

constructor TCloudPay_B.Create;
begin
  init; //做一些初始化操作 比如参数读取 或 参数动态创建
end;

destructor TCloudPay_B.Destroy;
begin
  //可能有些参数需要释放
  inherited;
end;

function TCloudPay_B.getClassname: string;
begin
  Result:= 'TCloudPay_B';
end;

procedure TCloudPay_B.init;
begin
  //各支付平台有各子的配置参数 可在这里读取本地配置文件
end;

function TCloudPay_B.Pay(const sIn: string; out sOut: string): Integer;
begin
  //
  Result:= 200;
end;

function TCloudPay_B.Query(const sIn: string; out sOut: string): Integer;
begin
  //
  Result:= 200;
end;

end.

支付单元uPay.pas代码:

unit uPay;

interface

uses
  SysUtils, uPayInterface, uCloudPay_A, uCloudPay_B;

type
  TPay = class(TObject)
  private
    IPayObj: IPay;
  protected
    //
  public
    constructor Create(iType: Integer);
    destructor Destroy; override;
    function getPayObjClass: string;                                  //获取IPayObj的创建类名
    function Pay(const cPay: Currency; out sOut: string): Integer;    //支付
    function Query(const sOrderId: string; out sOut: string): Integer;  //查询
  end;

implementation

{ TPay }

constructor TPay.Create(iType: Integer);
begin
  //根据外部传入的平台类型 创建不同的对象
  case itype of
    0: //TCloudPay_A
      begin
        IPayObj:= TCloudPay_A.Create;
      end;
    1: //TCloudPay_B
      begin
        IPayObj:= TCloudPay_B.Create;
      end;
  end;
end;

destructor TPay.Destroy;
begin
  //接口对象用完会自动释放 也可以通过设置nil主动释放
  if Assigned(IPayObj) then
    IPayObj:= nil; //可以这样主动释放接口; 同时拥有它的类也会释放
  inherited;
end;

function TPay.getPayObjClass: string;
begin
  Result:= IPayObj.getClassname;
end;

function TPay.Pay(const cPay: Currency; out sOut: string): Integer;
var
  sIn: string;
begin
  //sIn:= ...
  Result:= IPayObj.Pay(sIn, sOut);
end;

function TPay.Query(const sOrderId: string; out sOut: string): Integer;
var
  sIn: string;
begin
  //sIn:= ...
  Result:= IPayObj.Query(sIn, sOut);
end;

end.

窗体单元uFrmMain.pas代码:

unit uFrmMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, uPayInterface, uPay;

type
  TFrmMain = class(TForm)
    RadioGroup1: TRadioGroup;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    Button9: TButton;
    Button10: TButton;
    Button11: TButton;
    Button12: TButton;
    procedure Button9Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure Button11Click(Sender: TObject);
    procedure Button12Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    FPay_A: TPay;
    FPay_B: TPay;
    FPay: TPay;
  end;

var
  FrmMain: TFrmMain;

implementation

{$R *.dfm}

procedure TFrmMain.Button10Click(Sender: TObject);
var
  sOut: string;
begin
  if Assigned(FPay) then
  begin
    FPay.Pay(0.01, sOut);
    ShowMessage(FPay.getPayObjClass+ ' Pay');
  end;
end;

procedure TFrmMain.Button11Click(Sender: TObject);
var
  sOut: string;
begin
  if Assigned(FPay) then
  begin
    FPay.Query('100011011020', sOut);
    ShowMessage(FPay.getPayObjClass+ ' Query');
  end;
end;

procedure TFrmMain.Button12Click(Sender: TObject);
begin
  if Assigned(FPay) then
    FreeAndNil(FPay);
end;

procedure TFrmMain.Button9Click(Sender: TObject);
var
  iType: Integer;
begin
  iType:= 0;
  if RadioButton2.Checked then
    iType:= 1;
  //iType 可以通过本地ini文件配置或其它配置读取  
  if not Assigned(FPay) then
    FPay:= TPay.Create(iType);
end;

end.

在uPay.pas中,定义了IPayObj, TPay.Create方法通过传入的参数iType,创建不同的实现类实例, 通过这种方式, 就不用去分别定义TCloudPay_A,TCloudPay_B的对象,就一个IPayObj就可以了。 由此,没有去测试实现多接口,如果测试的话,就不能像这样定义一个统一的IPayObj入口了。

水平有限,了解不深,后续跟进.

Keil uVision5 STM32 startup_stm32f10x_md_vl.s error A3906U Malformed via file target not created.. 🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。 阅读详情

相关推荐

【Flink】状态编程: 订单超时告警

文章目录一、基础概念二、Flink状态编程1、支持的状态类型2、Managed Keyed State六种类型基本API状态的生命周期3、Managed Operator State三、案例:订单延迟告警统计1、需求描述2、需求分析3、数据与模型4、详细实现 一、基础概念 在Flink架构体系中,有状态计算可以说是Flink非常重要的特性之一。 有状态计算是指: 在程序计算过程中,在Flink...

一只皮皮熊 2862

delphi 接口

学习 delphi 接口 一切都是纸老虎!!! 第四章          接口  前不久,有位搞软件的朋友给我出了个谜语。谜面是“相亲”,让我猜一软件术语。我大约想了一分钟,猜 出谜底是“面向对象”。我觉得挺有趣,灵机一动想了一个谜语回敬他。谜面是“吻”,也让他猜一软件术 语。一分钟之后,他风趣地说:“你在面向你美丽的对象时,当然忍不住要和她接口!”。我们同时哈哈大 笑起来。谈笑间,似

流年~~ 1万+

别再算错了!深入SAP FI后台,看懂外币清账时汇兑损益的自动计算逻辑

刚接手一家跨国企业的SAP财务模块优化项目时,我遇到了一个棘手案例:每月末外币清账产生的汇兑损益金额总是与财务团队的预期存在差异。最令人困惑的是,系统似乎"擅自"计算出了1989.11元的损益,而财务人员反复手工验算都无法复现这个数字。这让我意识到,要真正掌握SAP FI的外币处理能力,必须深入理解系统后台的汇兑损益计算逻辑——不是停留在操作层面,而是穿透到算法内核。这个过程的精妙之处在于,损益金额不是简单比较两个时点的市场汇率,而是反映业务执行全周期的汇率影响。:损益金额与手工计算不符。

weixin_32932149的博客 473

delphi 接口的知识

Delphi 接口是 Delphi 编程语言中的一个重要概念。它是用于实现面向对象编程中的接口技术,可以使得程序代码具有更好的灵活性和可扩展性。接口定义了一组方法,任何实现该接口的类都必须实现这些方法,这样就可以通过接口访问这些方法,而不必关心具体实现类的细节。 在 Delphi 中,可以使用 interface 关键字定义接口,并通过实现该接口的类来实现接口的方法。接口中定义的方法都是抽象的,不...

weixin_35756690的博客 435

模拟CMOS集成电路设计入门学习(1)

模拟CMOS集成电路设计入门学习(1):二级效应

qq_61052827的博客 3084

Frenet坐标系下动态街道场景的最优轨迹生成

本文详细解读了Lattice Planner

BigDavid123的博客 2390

delphi interface 总结

1、 interface 是申明了一些函数,自己本身没有定义部分,需要由继承它的类来实现函数。 2、interface 可以被不同的类继承,并且函数的实现方法各不相同。 3、继承interface 的类,必须包含全部interface的函数,否则无法编译通过。

hust平凡之路 的博客 6131

abb机器人指令手册_ABB机器人配置圆形输送链跟踪

更多内容请点击上方ABB机器人实战技巧关注也可点击公众号下方往期经典浏览更多内容转载请先后台留言,大家一起支持原创,推动机器人使用和发展本公众号对各类ABB机器人应用,仿真,毕业设计提供技术支持,详细后台留言本公众号诚挚希望与各机器人培训机构,机器人使用单元合作,提供技术支持,详细后台留言1. 通常的机器人输送链跟踪,均为直线输送链跟踪,例如下图2. 有些情况,输送链为圆形,例如...

weixin_39849894的博客 2044

Delphi语法(六)接口

Delphi语法 第七章 接口

ForAnnuus的博客 1039

统信UOS开发环境支持Java

集成了JDK和多种IDE,为开发者提供了从代码编写、编译、调试到部署的一站式开发解决方案。

RZer的博客 2254

YOLOv8中Bottleneck模块的残差连接机制解析

本文深入解析了YOLOv8目标检测模型中Bottleneck模块的核心设计,重点阐述了其残差连接机制。该机制通过构建一条信息“捷径”,有效缓解了深层网络中的梯度消失问题,稳定了训练过程,并提升了特征提取效率。文章结合代码详细拆解了模块结构,并探讨了其在YOLOv8骨干网络与检测头中的关键作用及参数调优思路。

weixin_29061821的博客 253

delphi-多态(overload,override)与接口(interface)

delphi-多态(overload,override)与接口(interface) 先来聊聊重载问题(也叫超载,总之是那个Overload)吧。在同一个类中,出现多个同名的方法的现象就是Overload。联系起上面提到的兄弟俩,我想这更好理解。他们从外观上是相似的,不同的是某些“参数”,类型上可能各异或是个数上不同。 在Delphi中,所有方法都默认是静态的,便于编译器和链...

554

ERROR: Ignored the following yanked versions: 0.8.3, 0.10.19.dev18 的解决办法

关于这个问题,博主是在进行项目中的python依赖包安装的时候遇见的,遇到的异常:关于这个问题,是在。

Spring Boot-Common On With You 642

delphi 接口Interface

学习 delphi 接口 一切都是纸老虎!!! 第四章          接口  前不久,有位搞软件的朋友给我出了个谜语。谜面是“相亲”,让我猜一软件术语。我大约想了一分钟,猜 出谜底是“面向对象”。我觉得挺有趣,灵机一动想了一个谜语回敬他。谜面是“吻”,也让他猜一软件术 语。一分钟之后,他风趣地说:“你在面向你美丽的对象时,当然忍不住要和她接口!”。我们同时哈哈大 笑起来。谈笑间,似乎...

weixin_33676492的博客 324

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Delphi中Interface接口的使用方法

  unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type   //定义接口如果接口独立成一个文件,则在应用程序中和实现程序中都要引用该接口文件;    ICar = interfa

Chang的专栏 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Delphi Interface接口的定义

type   InterfaceName = interface(ancestorInterface)     ['{GUID}']     memberList   end; 接口定义中ancestorInterface 和 GUID是可选的。 在大多数方面,接口声明和类声明相似,但有以下限制:   1.memberList只能包含方法和属性,而不能包含数据成员(field).

FantasyWind-奇风的悟道之地 2146

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Delphi中Interface接口的使用方

//转自 http://blog.youkuaiyun.com/delphi1234/archive/2008/02/20/2110095.aspx unit Unit1; interface uses Windows, Messages, SysUtils, Variants,

工作是我的生活 我为工作而陶醉 1459
上一篇: Delphi 连接 Java和.Net WebService 整理
下一篇: Delphi 位运算符 shl shr or xor and not
ceaningking
博客等级 码龄17年 121粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值