当前位置:网站首页>类方法和类变量的使用
类方法和类变量的使用
2022-07-04 20:34:00 【pcplayer】
前言
Delphi 语法,有类方法 class procedure 和 class function ;也有类变量 class var。
可以用来干嘛?
场景
WebService 服务器端,多个 SoapDataModule 共用的方法,放到一个 DataModule 里面去。
每次 SOAP 调用,需要在 SoapDataModule 实现接口方法里面,创建该 DataModule 的实例,调用其方法,然后释放。
创建和释放的代码,总是重复。并且,没有对象缓冲池。
当然,可以给这个 DataModule 实现一个基于接口释放的对象缓冲池,但代码架构就比较复杂了。
如果想少写代码,则可考虑在该 DataModule 里面实现自己的创建和释放以及缓冲管理的代码。
背景:
请查阅本篇文章的上一篇文章。
代码例子
以下代码测试通过
该模块自己实现自己的缓冲池的代码
unit UDmPool;
interface
uses
System.SysUtils, System.Classes;
type
TDmPool = class(TDataModule)
private
{ Private declarations }
class var FList: TList;
public
{ Public declarations }
class function GetMyDM: TDmPool;
class procedure ReleaseDM(DM: TDmPool);
class function GetPoolCount: Integer;
function HelloPool(const S: string): string;
end;
implementation
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
{ TDmPool }
class function TDmPool.GetMyDM: TDmPool;
var
DM: TDmPool;
begin
if not Assigned(FList) then FList := TList.Create;
if FList.Count = 0 then
begin
DM := TDmPool.Create(nil);
Result := DM;
end
else
begin
DM := TDmPool(FList.Items[0]);
FList.Delete(0);
end;
end;
class function TDmPool.GetPoolCount: Integer;
begin
if not Assigned(FList) then
begin
Result := 0;
Exit;
end;
Result := FList.Count;
end;
function TDmPool.HelloPool(const S: string): string;
begin
Result := 'Hello, ' + S + '; This is DmPool';
end;
class procedure TDmPool.ReleaseDM(DM: TDmPool);
begin
FList.Add(DM);
end;
end.
在 SOAPDATAMODULE 里面调用它的代码
function TSoapDM_A.HelloPool(const S: string): string;
var
DM: TDmPool;
begin
DM := TDmPool.GetMyDM;
Result := DM.HelloPool('SoapDM_A' + S);
TDmPool.ReleaseDM(DM);
end;
服务器端界面显示缓冲池数量的代码
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label2.Caption := 'PoolCount = ' + TDmPool.GetPoolCount.ToString;
end;
结论:
使用 class function 和 class var 可以解决把重复代码集中实现在一个类里面的预期。同时实现一个简单的缓冲池。
边栏推荐
- Embedded TC test case
- Huawei ENSP simulator layer 3 switch
- 杰理之AD 系列 MIDI 功能说明【篇】
- What are the functional modules of RFID warehouse management system solution
- 基于OpenCV haarcascades的对象检测
- __ init__ () missing 2 required positive arguments
- admas零件名重复
- c语言函数形参自增自减情况分析
- Can be displayed in CAD but not displayed in print
- y56.第三章 Kubernetes从入门到精通 -- 业务镜像版本升级及回滚(二九)
猜你喜欢
CAD中能显示打印不显示
Can be displayed in CAD but not displayed in print
redis03——Redis的网络配置与心跳机制
Stealing others' vulnerability reports and selling them into sidelines, and the vulnerability reward platform gives rise to "insiders"
【1200. 最小絕對差】
Day24: file system
杰理之AD 系列 MIDI 功能说明【篇】
Foxit pdf editor v10.1.8 green version
迈动互联中标北京人寿保险
PS竖排英文和数字文字怎么改变方向(变竖直显示)
随机推荐
Use of redis publish subscription
WGCNA analysis basic tutorial summary
Jerry's ad series MIDI function description [chapter]
__init__() missing 2 required positional arguments 不易查明的继承错误
基于OpenCV haarcascades的对象检测
Redis pipeline
Actual combat simulation │ JWT login authentication
每日一题-LeetCode556-下一个更大元素III-字符串-双指针-next_permutation
测试用例 (TC)
改善机器视觉系统的方法
Embedded TC test case
minidom 模块写入和解析 XML
刘锦程荣获2022年度中国电商行业创新人物奖
Huawei ENSP simulator configures DHCP for router
杰理之AD 系列 MIDI 功能说明【篇】
torch. Tensor and torch The difference between tensor
网件r7000梅林系统5g不稳定 5g信号经常掉线解决方法
nmap扫描
Jerry's ad series MIDI function description [chapter]
redis事务