我的项目中有一个奇怪的问题。我有一个从基类继承的类(它又从另一个基类继承)并覆盖了一个函数。但是,当调用该函数时,它永远不会调用被覆盖的函数,而是调用基函数。
但是,当我在中间类中覆盖该函数时,它会被调用。但这很令人困惑:让我们用一张图来解释:)
lib GuiShared
- b级屏幕
- 虚函数 InitializeRoc
- b级屏幕
库 TigerControlRoot
- bTigerScreen 类
- 覆盖函数 InitializeRoc <-- 当在这里被覆盖时,它被调用
- bTigerScreen 类
- lib TigerControlRootCommonScreens
- 类 CheckInRules
- 覆盖函数 InitializeRoc <-- 未调用:s
- 类 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();
}
}
}
失败的类(或该库中的任何其他类)
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]' 违反了类型参数 'T' 的约束。
在另一个项目中使用了具有相同 GuiShared 库的类似代码,没有问题。