我的項目中有一個奇怪的問題。我有一個繼承自基類的類(它再次從另一個基類繼承)並重寫一個函數。但是,當調用該函數時,它永遠不會調用覆蓋函數,而是調用基函數。未調用的重寫的虛函數
但是,當我重寫中間類中的函數時,它被調用。但是,這是令人困惑:讓我們用繪圖:)
LIB GuiShared
- 類bScreen
- 虛函數InitializeRoc
- 類bScreen
LIB TigerControlRoot
解釋- 類bTigerScreen
- 覆蓋功能InitializeRoc < - 這裏重寫時,它被調用
- 類bTigerScreen
- LIB TigerControlRootCommonScreens
- 類CheckInRules
- 超越功能InitializeRoc < - 不叫:但是小號
- 類CheckInRules
構造函數被調用......
這是我(簡化)代碼:
共享基地
namespace Ppb.GuiShared.Screens {
public partial class bScreen<T> : Ppb.Controls.pPanel where T : FrameworkMiddleware.Framework.Remoting.Remotable, FrameworkMiddleware.IInitialize, new() {
public virtual void Load(bMain<T>.LoadEventArgs args) {
log.Trace("InitializeRoc " + this.GetType().FullName);
InitializeRoc(args);
_hasLoaded = true;
}
protected virtual void InitializeRoc(bMain<T>.LoadEventArgs args) { }
}
}
項目基類
namespace Tiger.ControlRoot.Screens {
public partial class bTigerScreen : Ppb.GuiShared.Screens.bScreen<roc.Tiger> {
public bTigerScreen(GuiSettings settings, roc.Tiger tiger)
: base(settings, tiger) {
InitializeComponent();
InitializeMenu();
}
}
}
失敗的類(或從LIB任何其他類)
namespace Tiger.ControlRoot.CommonScreens {
[ControlRoot.Screens.TigerScreenInfo("Testje", Tiger.ControlRoot.Screens.TigerScreenInfoAttribute.elevel.User, true)]
public class CheckInRules : ControlRoot.Screens.bTigerScreen {
public CheckInRules(GuiSettings settings, roc.Tiger tiger)
: base(settings, tiger) {
}
protected override void InitializeRoc(Ppb.GuiShared.bMain<TigerMiddleware.TigerRoc.Tiger>.LoadEventArgs args) {
base.InitializeRoc(args);
}
}
}
如果這還不夠,當我嘗試調用基類我一些功能收到一個TypeLoadException。
GenericArguments[0], 'TigerMiddleware.TigerRoc.Tiger', on 'Ppb.GuiShared.bMain`1+LoadEventArgs[T]' violates the constraint of type parameter 'T'.
與同GuiShared LIB相似的代碼在另一個項目中使用,也沒有任何問題。
請提供一個簡短但完整的程序(最好是一個控制檯應用程序)來演示問題。我們目前得到的片段並不是很清楚(無論如何,對我來說)。 – 2009-03-04 10:21:39
你能告訴我們TigerMiddleware.TigerRoc.Tiger的定義嗎? – 2009-03-04 10:25:13