事實上,網上有很多關於此的東西,但更多的是我讀了更多的混淆我。我寫了一個名爲Combinatorics
的組件,它執行一些數學概率的東西。代碼非常簡短,因爲我不想讓它變得複雜。我在這裏做一個小的預覽:Delphi界面引用計數機制
//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
因爲有ref計數機制,所以我可以最終沒有嘗試地給它賦一個類(TCombinazioni,TDisposizioni或TPermutazioni)。我不確定我是否已正確編碼。假設:
- 用戶選擇
cDisposition
和做了計算 - 用戶選擇
cDisposition
(不同的值),並做了計算 - 用戶選擇
cPermutation
和做了計算
我我總是在FEngine
上工作。參考計數如何歸零?當表單(和組件)銷燬時它是否爲零?我希望我已經解釋了我不明白的東西。 FEngine
是一個私有變量,我在運行時爲它分配不同的類(調用Create)。當表格破壞或分配新類時,ref計數是否爲0?
我編碼它就像上面,因爲尼克霍奇斯在他的書中做到了這一點,我當然相信他,但我想知道我做了什麼。
您可以簡單地將析構函數添加到您的接口對象中,並將斷點放在發現的位置。 –
我猜你指的是「在delphi中編碼」的TEncryption示例;)我剛剛檢查過這本書,你應該在本章中間找到關於TInterfacedObject的問題的答案! –
@Sertac我不知道你在說什麼對不起,我現在在學習,所以我覺得這很容易問 –