博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
以接口为主导的设计中, 我在使用的框架模式
阅读量:6371 次
发布时间:2019-06-23

本文共 4252 字,大约阅读时间需要 14 分钟。

在今后的 Delphi 中, 以接口、结构为主的设计应该会越来越多, 因为这样太方便了.
System.RegularExpressions 就是以结构为主体设计的非常好的示范; 但更多东西使用接口会更合适.
有见过他人早就使用接口写程序, 从手头的这个程序开始我才开始使用.
现在基本总结出四种框架模式: 1、直接实现; 2、间接实现(或叫继承实现); 3、覆盖实现; 4、委托实现.

一、直接实现:
下例中虽有 TMy1、TMy2, 但在具体应用中使用的应是 IMy1、IMy2, 这就是我所谓的以接口为主导.
TMy1、TMy2 直接实现了所属接口的所有方法, 这是我所谓的直接实现.
这样可能会有代码重复, 但如果程序很小, 还是挺实用的.

unit Unit1;interfaceuses  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;type  TForm1 = class(TForm)    procedure FormCreate(Sender: TObject);  end;  IA = Interface    procedure Method_A;  end;  IB = Interface(IA)    procedure Method_B;  end;  IMy1 = Interface(IB)    procedure Method_My1;  end;  IMy2 = Interface(IB)    procedure Method_My2;  end;  TMy1 = class(TInterfacedObject, IMy1)    procedure Method_A;    procedure Method_B;    procedure Method_My1;  end;  TMy2 = class(TInterfacedObject, IMy2)    procedure Method_A;    procedure Method_B;    procedure Method_My2;  end;var  Form1: TForm1;implementation{$R *.dfm}{ TMy1 }procedure TMy1.Method_A;begin  ShowMessage('A');end;procedure TMy1.Method_B;begin  ShowMessage('B');end;procedure TMy1.Method_My1;begin  ShowMessage('My1');end;{ TMy2 }procedure TMy2.Method_A;begin  ShowMessage('A');end;procedure TMy2.Method_B;begin  ShowMessage('B');end;procedure TMy2.Method_My2;begin  ShowMessage('My2');end;{测试}procedure TForm1.FormCreate(Sender: TObject);var  v1: IMy1;  v2: IMy2;begin  v1 := TMy1.Create;  v1.Method_A;  v1.Method_B;  v1.Method_My1;  v2 := TMy2.Create;  v2.Method_A;  v2.Method_B;  v2.Method_My2;end;end.

二、间接实现:
下面例子通过一个间接的 TB 类, 避免了 TMy1、TMy2 中可能会重复的代码.

unit Unit1;interfaceuses  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;type  TForm1 = class(TForm)    procedure FormCreate(Sender: TObject);  end;  IA = Interface    procedure Method_A;  end;  IB = Interface(IA)    procedure Method_B;  end;  TB = class(TInterfacedObject, IB)    procedure Method_A;    procedure Method_B;  end;  IMy1 = Interface(IB)    procedure Method_My1;  end;  IMy2 = Interface(IB)    procedure Method_My2;  end;  TMy1 = class(TB, IMy1)    procedure Method_My1;  end;  TMy2 = class(TB, IMy2)    procedure Method_My2;  end;var  Form1: TForm1;implementation{$R *.dfm}{ TB }procedure TB.Method_A;begin  ShowMessage('A');end;procedure TB.Method_B;begin  ShowMessage('B');end;{ TMy1 }procedure TMy1.Method_My1;begin  ShowMessage('My1');end;{ TMy2 }procedure TMy2.Method_My2;begin  ShowMessage('My2');end;{测试}procedure TForm1.FormCreate(Sender: TObject);var  v1: IMy1;  v2: IMy2;begin  v1 := TMy1.Create;  v1.Method_A;  v1.Method_B;  v1.Method_My1;  v2 := TMy2.Create;  v2.Method_A;  v2.Method_B;  v2.Method_My2;end;end.

三、覆盖实现:
从 TB 继承的过程中当然也可以通过覆盖虚函数而实现多态, 下面的 TMy2 就这么做了.

unit Unit1;interfaceuses  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;type  TForm1 = class(TForm)    procedure FormCreate(Sender: TObject);  end;  IA = Interface    procedure Method_A;  end;  IB = Interface(IA)    procedure Method_B;  end;  TB = class(TInterfacedObject, IB)    procedure Method_A; virtual;    procedure Method_B; virtual;  end;  IMy1 = Interface(IB)    procedure Method_My1;  end;  IMy2 = Interface(IB)    procedure Method_My2;  end;  TMy1 = class(TB, IMy1)    procedure Method_My1;  end;  TMy2 = class(TB, IMy2)    procedure Method_A; override;    procedure Method_B; override;    procedure Method_My2;  end;var  Form1: TForm1;implementation{$R *.dfm}{ TB }procedure TB.Method_A;begin  ShowMessage('A');end;procedure TB.Method_B;begin  ShowMessage('B');end;{ TMy1 }procedure TMy1.Method_My1;begin  ShowMessage('My1');end;{ TMy2 }procedure TMy2.Method_A;begin  ShowMessage('A_My2');end;procedure TMy2.Method_B;begin  ShowMessage('B_My2');end;procedure TMy2.Method_My2;begin  ShowMessage('My2');end;{测试}procedure TForm1.FormCreate(Sender: TObject);var  v1: IMy1;  v2: IMy2;begin  v1 := TMy1.Create;  v1.Method_A;  v1.Method_B;  v1.Method_My1;  v2 := TMy2.Create;  v2.Method_A;  v2.Method_B;  v2.Method_My2;end;end.

四、委托实现:
接口中的方法是肯定要实现的, 但也可以通过 implements 关键字借用(或叫委托)其它的实现;
但, 官方文档说这只适用于 Win32. 就是说这种方法在 Win64 和其它系统都不行, 还学它干嘛?

转载地址:http://jeuqa.baihongyu.com/

你可能感兴趣的文章
使用sysbench压力测试MySQL(一)(r11笔记第3天)
查看>>
css知多少(11)——position
查看>>
【Spring】定时任务详解实例-@Scheduled
查看>>
先有的资源,能看的速度看,不能看的,抽时间看。说不定那天就真的打不开了(转)...
查看>>
哪些领域适合开发微信小程序
查看>>
谁说数据库防火墙风险大?可能你还不知道应用关联防护
查看>>
ASP.NET Core应用针对静态文件请求的处理[2]: 条件请求与区间请求
查看>>
怎样做一个企业?尤其是在这个互联网时代
查看>>
DVNA:Node.js打造的开源攻防平台
查看>>
17个案例带你3分钟搞定Linux正则表达式
查看>>
Java 8 比较器:如何对 List 排序
查看>>
苹果是否步思科后尘折戟中国
查看>>
漏洞预警!微软曝光震网三代漏洞,隔离网面临重大危机
查看>>
协鑫集成第二批1000台E-KwBe光伏储能设备即将启运澳洲
查看>>
爱立信物联网广州路演
查看>>
云计算企业业绩分化明显 9家上市公司中期预喜
查看>>
《VMware Virtual SAN权威指南(原书第2版)》一3.5 可能发生的网络配置问题
查看>>
SK电讯发布Q2财报 净利润同比下降26.9%
查看>>
零售品牌如何驾驭大数据主导商业决策?
查看>>
经济模式UPS在数据中心的应用(上)
查看>>