2008-12-09 145 views
1

我的同事和我一直在討論如何在函數中聲明變量。如何聲明變量

假設你有一個稱爲TStrings的類(爲了解釋起見使用Delphi),它至少有一個抽象方法和一個名爲TStringList的後代類,它顯然實現了抽象方法,但它沒有引入任何你需要的東西尚未在祖先中實現,您將如何聲明TStringList類型的函數變量?

這裏有兩個例子。這被認爲是更好的做法,爲什麼?

procedure AddElements; 
var 
    aList: TStringList; 
begin 
    aList := TStringList.Create; 
    try 
    aList.Add('Apple'); 
    aList.Add('Pear'); 
    finally 
    aList.free; 
    end; 
end; 

procedure AddElementsII; 
var 
    aList: TStrings; 
begin 
    aList := TStringList.Create; 
    try 
    aList.Add('Apple'); 
    aList.Add('Pear'); 
    finally 
    aList.free; 
    end; 
end; 
+0

有人想添加一個語言標記,或者是有一個,我只是不知道它。 – UnkwnTech 2008-12-09 11:44:25

回答

1

它是一個TStringList,所以你也應該聲明它爲TStringList(第一個例子)。其他一切都可能會讓你或其他人在後面讀取代碼時感到困惑。

0

我的投票是第二種形式 - 這個想法是TStrings定義了一個契約/接口,並且更好地爲他們編寫代碼。

0

我想說,這取決於你是否期望如果TStringList可能會改變爲其他實現TStrings的東西。如果你不希望它改變,可以使用TStringList並獲得僅僅在TStringList中的特殊功能(猜測情況並非如此)。如果您希望它可能會更改,請將其聲明爲TStrings並堅持「安全」方法。

在這個特定的情況下,我會說沒關係。地獄,你可能會改變變量聲明,並且無論如何都不會改變。所以請選擇你最喜歡的 - 這是一個偏好問題。

0

我同意Schnaader。

TStringList有更多的屬性和方法TStrings(它是一個抽象類)。使用TStrings變量禁止使用這些成員使用您正在使用的演員。但是我認爲這使事情變得更糟。

您可以在函數參數中使用TStrings。

procedure TMyClass.MyMethod(const AList: TStrings); 
begin 
end; 

或者作爲一個屬性。但是,如果局部變量和字段被標記爲真實類型,則它們更具多功能性。

0

這取決於...

在Java中,我經常看見使用最高的抽象級別可用做聲明的建議,雖然它一般適用於接口。

例如:

Collection list = new ArrayList(); 
[loop] list.add(someItem); [end loop] 


爲什麼?它允許更改實現(在某些情況下是一個細節:某些實現更適合某些用法(隊列,鏈表,堆棧...),這可能主要是速度/內存問題),通過最小化變更的影響。

當然,如果您使用特定於實現的方法,則必須在聲明中更具體。

另一個優點:當一個方法需要一個Collection參數時,只要它只需要使用泛型方法,它就可以在更廣泛的輸入範圍內工作。