2009-01-16 52 views
0

編輯:Delphi中的函數和過程(默認和可選參數)

有沒有更好的方法來做到這一點?

TPendingBets = class(TDataModule) 
    private 
    public 
    function GetBdy(out IdEvent : Integer       )               : Boolean; overload; 
    function GetBdy(out IdEvent : Integer; out idBetType : TBetTypes)               : Boolean; overload; 
    function GetBdy(out IdEvent : Integer; out idBetType : TBetTypes; Out TotalOrgStake,Price : Double; out PriceError :Boolean): Boolean; overload; 
    end; 

implementation 

////////////////////

function TPendingBets.GetBdy(out IdEvent : Integer): Boolean; 
var idBetType : TBetTypes; 
    TotalOrgStake,Price : Double; 
    PriceError :Boolean; 
begin 
    result := GetBdy(IdEvent,idBetType,TotalOrgStake,Price,PriceError); 
end; 

//////////////// ////

function TPendingBets.GetBdy(out IdEvent : Integer; out idBetType : TBetTypes): Boolean; 
var TotalOrgStake,Price : Double; 
    PriceError :Boolean; 
begin 
    result := GetBdy(IdEvent,idBetType,TotalOrgStake,Price,PriceError); 
end; 

////////////////////

function TPendingBets.GetBdy(out IdEvent : Integer; out idBetType : TBetTypes; Out TotalOrgStake,Price : Double; out PriceError :Boolean): Boolean; 
begin 
    result := false; 
    if cdBdy.Eof = False then 
    begin 
     IdEvent := cdBdy.FieldByName(IdEvent).AsInteger); 
     idBetType := TBetTypes(cdBdy.FieldByName(idBetType).AsInteger); 
     //. 
     //. 
     result := True; 
    end; 
end; 

注:

正如我最初的問題不是很清楚我已刪除了它

回答

5

部分我認爲超載的解決方案是一個相當不錯的解決方案,它至少是一個。其他編程語言要求您使用不同的名稱聲明函數。

另一種方法可能會像一個動態數組參數:

type 
    TExtendedDynArray = array of Extended; // if not already declared elsewhere 

function Fn1(out arr: TExtendedDynArray): Boolean; 
2

除了什麼烏韋寫的(我同意,超載這裏是一個更好的解決方案;最多投票),你不應該設定一個輸出參數在函數的開始處有任何值。這就是意味着什麼。

1

可以使用重載的函數是這樣的

功能Fn1的(輸出A:字符串; B:整數= 5):布爾;超載;

function Fn1(Out A:string):boolean;超載;

您必須定義這兩個函數。

+0

我認爲這是行不通的,因爲像Fn1(astringvar)這樣的調用是模糊的。編譯器不應該接受它。 – 2009-01-16 18:25:27

9

超載並不意味着在函數中有5個副本代碼。您可能有5個功能,但其中4個只需使用正確的參數調用的主要功能。

我一般不喜歡參數。您是否考慮過返回包含所有結果的記錄?

Fn1Result = record 
    A: Extended; 
    B: Integer; 
    C, D, E, F: Extended 
    S: String; 
end; 

然後聲明您的功能,如:

function Fn1: Fn1Result; 
begin 
    Fn1.A := C_ConstA; 
    // etc. . . . 
end; 

當然我假設你不使用的輸出參數作爲輸入。根據德爾福的幫助:

一個out參數,像一個變量參數,通過引用傳遞。但是,對於out參數,引用變量的初始值會被傳遞給它的例程丟棄。 out參數僅用於輸出;也就是說,它告訴函數或過程在哪裏存儲輸出,但不提供任何輸入。

我得到一個有趣的感覺,你正在使用輸出參數作爲輸入參數。別。如果你想讓他們走兩條路,可以通過var

0

默認值只能用於輸入參數(即:By value和const)。對於var和out參數,默認值是不可能的。

正如Jim已經指出的那樣:您可以通過讓大多數重載函數調用佔用所有參數的函數來避免重複代碼,因此它們只是原始函數的薄層。從Delphi 2005開始,你可以聲明它們是內聯的,所以編譯器可能實際上生成更高效的代碼。

1

由於Jim顯示,您不需要在重載時複製代碼。

我不喜歡太多混合參數與默認值重載,因爲(這樣做不加小心),你可以創建一個混亂。

通常情況下,如果我要支持很多語法:

1)我定義了一個完整的簽名,與所有參數。我們稱之爲 '主''。

2)所有的重載都會調用那個。或者互相呼叫,但最後每個 超載鏈都必須調用'主'來執行任務。

對我來說,重載是「參數crunchers」或「翻譯」。後來,如果我需要 某些東西來修改主行爲,我在'master'上創建了新的參數(它可以有默認值 - 事實上,大部分都有)。

如果我需要用新參數重載,我創建一個新的參數,它只是將它傳遞給 「主」過程。副作用是舊的繼續表現相同。