2011-01-25 70 views
2

在我的應用我有一個從類型的TThread的基礎線程對象(FrameObject)繼承兩個紗線對象(外部和腰帶)。這在D7中可以正常工作。應用程序需要擴展,我藉此機會將其移至D2010 - 但是,當我嘗試編譯Delphi時,抱怨FrameObject Create方法聲明與前一個聲明不同。繼承的問題,似乎並沒有工作在相同的D2010 D7

類類型和構造如下所示;

TFrameObject = class(TThread) 

constructor TFrameObject.Create(BuildType: TBuildType; OnBatchStep: TBatchNotify; OnThreadComplete: TNotifyTermination); 
begin 
    inherited Create(True); 
    ... 
end; 


TOuter = class (TFrameObject) 

constructor Create(BuildType: TBuildType; OnBatchStep: TBatchNotify; OnThreadComplete: TNotifyTermination; ExceptionHandler: TExceptionHandler); 
begin 
    inherited create(BuildType, OnBatchStep, OnThreadComplete); 
    fExceptionHandler := ExceptionHandler; 
    ... 
end; 

TSash = class (TFrameObject) 
constructor Create(BuildType: TBuildType; OnBatchStep: TBatchNotify; OnThreadComplete: TNotifyTermination; ExceptionHandler: TExceptionHandler); 
begin 
    inherited create(BuildType, OnBatchStep, OnThreadComplete); 
    fExceptionHandler := ExceptionHandler; 
    ... 
end; 

的D2010代碼是D7源文件,並按照我說的直接複製,這一切都在D7(也許它不應該!)工作正常 - 所以我要去哪裏錯了?

回答

3

您在多個單位申報類型,其中一人在實現部分的接口和另一個被使用,因此,例如TBuildTypeTFrameObject申報(在接口部分)將解析爲UnitA.TBuildType和實施UnitB.TBuildType

+0

還要檢查庫路徑順序是兩個版本都一樣 - 這可能會幫助你找到違規單位。一個蠻力檢查問題是重命名您的演示應用程序中的類。如果「TFrameObjectTest」仍然存在問題,那麼您知道這一切都發生在您正在查看的單元中。 – 2011-01-31 02:08:28

1

我在到這裏發生了什麼的猜測是,在您的實現部分uses子句聲明TBuildTypeTBatchNotifyTNotifyTermination是從在聲明構造你的接口部分採用的不同。

一種快速的方法來檢查將在TFrameObject.Create實施完全限定的類型。

+0

這個問題似乎是在TFrameObject的創建方法,因爲這是基類外和窗扇的對象也看不出是怎麼回事的(?) - 除非它的抱怨創建TFRAME ISN的方法」與底層TThread的創建方法相同! – Paul 2011-01-26 10:58:51

+0

@paul只是做我的建議,並完全限定構造函數參數的類型。並且在您評論時使用@david,以便我收到評論的通知。 – 2011-01-27 23:28:34

1

按其他的答案,在實現部分隱藏式使用或聲明的接口部分相同名稱的使用單位新引進型是最有可能的解釋。

然而,不同於以前的答案,因爲這個問題只發生在D2010和不D7然後我會懷疑TExceptionHandler類型的的ExceptionHandler參數,因爲D2010包含具有此名稱的ToolsAPI \ IStreams聲明的類型。

你可以在實現部分限定名稱:

TFrameObject.Create(... ExceptionHandler: MyUnit.TExpectionHandler) 

其中「MyUnit」是包含「真正的」 TExceptionHandler你希望使用的單位的名稱。

或者,你可以別名接口部分類型和改變你的參數列表一直使用的別名類型在本機的接口和實現:

interface 

    type 
    TFrameExceptionHandler = TExceptionHandler; 

    TFrameObject = class... 
     ... 
     constructor Create(... ExceptionHandler: TFrameExceptionHandler); 
    end; 


    implementation 

    constructor TFrameObject.Create(... ExceptionHandler: TFrameExceptionHandler);