2010-11-18 84 views
1

我想清理我繼承的應用程序中的編譯器警告。我們的一個類繼承了TControl。我得到的警告是「重新聲明變更隱藏了基類中的成員」Redeclaration隱藏基類成員

「變更」是TControl中的受保護程序。我在看這個類有一個布爾屬性

property Changed : Boolean read FChanged write FChanged stored true;

重寫它還有我已經排除了幾個選項:

  1. 重命名從「」更改爲別的東西。這不是一個實際的選擇,因爲該屬性在應用程序中隨處可見。

  2. 使用編譯器指令隱藏警告。我可以做到這一點,但我寧願找出警告的含義以及如何糾正。

所以我的問題是:

1)這是警告實際上是一個問題嗎? 「隱藏基礎成員」有什麼含義?

2)如何在不重命名屬性或隱藏警告的情況下移除編譯器警告?

我使用德爾福2010年

[編輯:已經有使用重構工具來重命名出錯的屬性的幾個suggesions。我已經排除了這一點,因爲重構工具根本無法在此代碼庫上工作]

+3

該警告有效。這意味着您將無法在新控件中調用TControl.Changed。您的控件需要調用它來通知其本身及其父項屬性已更改。他們正在觀察該方法發送的'cm_Changed'消息。考慮調用你的財產'骯髒'而不是。 (另外,這聽起來像是一個奇怪的屬性,想要存儲在DFM中;加載表單的新實例後,說控制權已經改變是否正確) – 2010-11-18 01:53:13

+0

好點!不知道爲什麼它被存儲。 – awmross 2010-11-18 05:07:54

回答

5

如果您自己的'Changed'也是一個過程,那麼您可以使用override指令告訴編譯器您添加了功能TControl中的基礎Changed方法。如果你的聲明不同或者你想因爲其他原因打破繼承鏈,你可以指定reintroduce指令來告訴編譯器你有意識地破壞鏈。

可惜這是不可能的特性,所以你的問題不是

  1. 重命名「改爲」別的東西
  2. 隱藏使用指令
  3. 不要警告沒有真正的解決方案,其他t繼承TControl

我會選擇第一個選項。既然你使用的是Delphi 2010,你可以使用Delphi中的Refactoring工具重新命名屬性,儘管我會徹底檢查修改後再進行修改,因爲它們可能會影響基類中的Changed方法。 ..

+1

不要擔心重命名重構工具意外重命名該方法的可能性。首先,這不應該發生,因爲它們指的是獨特的東西;這就是重構工具與簡單查找替換的區別。其次,如果發生錯誤*,編譯器會告訴你每個問題的確切位置,因爲代碼不會再編譯 - 你不能在'Changed'方法的上下文中使用'Changed'屬性預計會。 – 2010-11-18 01:44:36

+0

即使'Changed'是一種方法,你*無法*向聲明中添加'override'。基類中的方法不是虛擬的。 – 2010-11-18 01:48:18

+0

重構工具不適用於我的項目。我只是按照你的建議進行了嘗試,並沒有將項目組中其他項目的用法重新命名。 – awmross 2010-11-18 04:21:05