gpt4 book ai didi

Delphi接口(interface)引用计数机制

转载 作者:行者123 更新时间:2023-12-03 14:42:04 27 4
gpt4 key购买 nike

确实,网上有很多关于此的内容,但我读得越多,我就越困惑。我编写了一个名为 Combinatorics 的组件,它可以执行一些数学概率的操作。该代码非常简短且简单,因为我不希望它变得复杂。我在这里做了一些预览:

//Combinatorio.pas
type
ICombinatorio = interface
function getSoluzioni(): integer; //soluzioni means "Solutions"
function getFormula(): string;
end;

//ImplCombinatorio.pas
type

TCombinazioni = class(TInterfacedObject, ICombinatorio)
private
n, k: integer;
ripetizione: boolean;
function fattoriale(const x: integer): integer;
public
constructor Create(const n, k: integer; const ripetizione: boolean);
function getSoluzioni(): integer;
function getFormula(): string;
end;

TDisposizioni = class(TInterfacedObject, ICombinatorio)
private
n, k: integer;
ripetizione: boolean;
function fattoriale(const x: integer): integer;
public
constructor Create(const n, k: integer; const ripetizione: boolean);
function getSoluzioni(): integer;
function getFormula(): string;
end;

TPermutazioni = class(TInterfacedObject, ICombinatorio)
private
n: integer;
k: string;
ripetizione: boolean;
function fattoriale(const x: integer): integer;
public
constructor Create(const n: integer; const k: string; ripetizione: boolean);
function getSoluzioni(): integer;
function getFormula(): string;
end;

您不需要了解函数和过程是如何实现的,这对于问题来说并不重要(您可以轻松想象它们的作用)。

<小时/>

这是我的第一个组件,我已经编译并安装了它并且它可以工作。但是我无法理解一些东西。

unit TCombinatorio;

interface

uses
System.SysUtils, System.Classes, Combinatorio, ImplCombinatorio;

type
cCombinatorio = (cNull = 0, cDisposition = 1, cPermutation = 2, cCombination = 3);

type
TCombinatorics = class(TComponent)
strict private
{ Private declarations }
Fn, Fk: integer;
FRep: boolean;
FType: cCombinatorio;
FEngine: ICombinatorio;
procedure Update;
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
function getSolution: integer;
function getFormula: string;
published
property n: integer read Fn write Fn;
property k: integer read Fk write Fk;
property kind: cCombinatorio read FType write FType default cNull;
property repetitions: boolean read FRep write FRep;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('RaffaeleComponents', [TCombinatorics]);
end;

{ TCombinatorics }

constructor TCombinatorics.Create(AOwner: TComponent);
begin

inherited Create(AOwner);
Fn := 0;
Fk := 0;
FType := cNull;
repetitions := false;

end;

function TCombinatorics.getFormula: string;
begin
Update;
Result := FEngine.getFormula;
end;

function TCombinatorics.getSolution: integer;
begin
Update;
Result := FEngine.getSoluzioni;
end;

procedure TCombinatorics.Update;
begin

case FType of
cDisposition:
FEngine := TDisposizioni.Create(n, k, repetitions);
cPermutation:
FEngine := TPermutazioni.Create(n, '', repetitions);
cCombination:
FEngine := TCombinazioni.Create(n, k, repetitions);
cNull:
raise Exception.Create('You have to select a type.');
end;

end;

end.

查看Update; 过程。我之所以创建它,是因为当用户以表单形式放置组件( link )时,他必须在对象检查器(或某处的代码)中设置构造函数中所需的 3 个重要参数。

由于FEngine: ICombinatorio,我可以为其分配一个类(TCombinazioni、TDisposizioni 或 TPermutazioni),而无需最终尝试,因为存在引用计数机制。我不确定我是否已正确编码。假设:

  1. 用户选择cDisposition并进行计算
  2. 用户选择cDisposition(不同的值)并进行计算
  3. 用户选择cPermutation并进行计算

我一直致力于FEngine。引用计数如何归零?当形式(和组件)破坏时它会变为零吗?我希望我已经很好地解释了我不明白的地方。 FEngine 是一个私有(private)变量,我在运行时向它分配不同的类(调用 Create)。当表单销毁或分配新类时,引用计数是否会变为 0?

我像上面那样编码,因为 nick hodges 在他的书中这样做了,我当然信任他,但我想知道我做了什么。

最佳答案

根据可以看到的代码,第一次调用Update时,会创建一个新的ICombinatorio实现者,并分配给FEngine >;引用计数将为 1。在调用 Update 后,将创建另一个新的 ICombinatorio 实现器实例(其引用计数将为 1)并分配给FEngineFEngine 指向的前一个实现者实例的引用计数将递减;如果它为零,那么它将被销毁。 (它可能基于您的代码示例)。

此外,当调用组件的析构函数时(当拥有的 Form 被销毁时),隐式实例清理代码会将 FEngine 设置为 nil,这将减少引用计数(并且,根据您的样本,将被销毁)。

因此,根据您的代码示例,我希望您的代码能够正常工作;干净地实例化和销毁 ICombinatorio 接口(interface)对象。

关于Delphi接口(interface)引用计数机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45176937/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com