這是我班的一個簡化版本:基類可以確定派生類是否已覆蓋虛擬成員?
public abstract class Task
{
private static object LockObject = new object();
protected virtual void UpdateSharedData() { }
protected virtual void UpdateNonSharedData() { }
public void Method()
{
lock(LockObject)
{
UpdateSharedData();
}
UpdateNonSharedData();
}
}
我試圖隱藏從派生類的鎖定代碼。但是我只想獲取鎖定,如果派生類重寫UpdateSharedData;如果沒有,我不希望該方法阻止並等待更新共享數據之前更新共享數據的所有其他正在運行的實例。
所以Method(看似)顯而易見的事情是檢查當前實例的UpdateSharedData實現是否覆蓋了基類的實現。我敢肯定,如果不使用反射,這是不可能的,這可能不是可取的。
我想過一些解決方法,此的,但他們都非常尷尬:
- 添加一個受保護的布爾屬性,派生類的構造函數集,並檢查屬性,看是否有鎖需要。這就隱藏了派生類中的鎖定代碼,這是非常糟糕的工作。
- 使UpdateSharedData方法成爲委託屬性,讓任何派生類將其屬性設置爲其構造函數中的私有方法,並且只有在委託不爲null時才獲取鎖定。這更好,但它仍然很糟糕。
將m.DeclaringType直接與t進行比較會更加正確。兩種不同的類型很可能具有相同的名稱。 – JaredPar 2009-02-06 04:05:16
如果使用「新」重新聲明(不覆蓋)該方法,那麼也會報告真實情況。 – 2009-02-06 04:15:34