2014-10-01 38 views
1

程序考慮這個類:類功能/程序和實例函數/名稱相同

unit u_myclass; 

interface 

type 
    TMyClass = class 
    public 
    class function Foo : Integer; 
    function Foo : Integer; 
    end; 

implementation 

{ TMyClass } 
class function TMyClass.Foo: Integer; 
begin 
Result := 10; 
end; 

function TMyClass.Foo: Integer; 
begin 
Result := 1; 
end; 

end. 

我想用一個類的函數,並具有相同名稱的實例函數。 可悲的是德爾福不喜歡這一點,編譯器barfs這些錯誤:

[DCC Error] u_myclass.pas(9): E2252 Method 'Foo' with identical parameters already exists 
[DCC Error] u_myclass.pas(20): E2037 Declaration of 'Foo' differs from previous declaration 
[DCC Error] u_myclass.pas(9): E2065 Unsatisfied forward or external declaration: 'TMyClass.Foo' 

我的問題:這是可能的還是這只是一個語言的限制(而我需要重命名的2種方法之一)?

+2

AFAIK,這是不可能的。編譯器應該如何知道你想調用哪個函數?當你調用一個類函數時,它可能是顯而易見的,但當你在一個實例上調用它時,它可能是顯而易見的。 – 2014-10-01 08:43:22

+0

好點Uwe,那一定是原因... – whosrdaddy 2014-10-01 08:45:29

+0

只需使用不同的名字。你試圖達到的是國際海事組織濫用職能超載;只有編譯器不允許它。 – kludg 2014-10-01 08:53:22

回答

2

這是不可能給使用相同的名稱爲實例方法和類方法。這是不允許的,在某些情況下,編譯器無法區分它們。

舉例來說,如果你寫:

procedure TMyClass.Bar; 
begin 
    Foo; 
end; 

那麼編譯器不能確定你是否希望調用類方法或實例方法。

+0

是的,@UweRaabe已經指出。只是想確定:) – whosrdaddy 2014-10-01 09:35:50

2

我發現的唯一的解決方案是使用過載和不同的參數:

unit u_myclass; 

interface 

type 
    TMyClass = class 
    public 
    class function Foo(A : Integer) : Integer; overload; 
    function Foo : Integer; overload; 
    end; 

implementation 

{ TMyClass } 
class function TMyClass.Foo(A: Integer): Integer; 
begin 
Result := A; 
end; 

function TMyClass.Foo: Integer; 
begin 
Result := 1; 
end; 

end. 
+0

這不是一個解決方案。您幾乎不可能以合理的方式期待呼叫者傳遞將被忽略的額外參數。 – 2014-10-01 09:29:42

+0

@DavidHeffernan:在我的真實世界用例中,這將是我的解決方案:) – whosrdaddy 2014-10-01 09:31:06

+0

真的。你會要求調用者傳遞一個值被忽略的參數嗎? – 2014-10-01 09:34:41

相關問題