代码之家  ›  专栏  ›  技术社区  ›  Stormenet

未调用重写的虚拟函数

  •  2
  • Stormenet  · 技术社区  · 16 年前

    我的项目有个奇怪的问题。我有一个从基类继承的类(它再次从另一个基类继承)并重写一个函数。但是,当调用该函数时,它从不调用被重写的函数,而是调用基函数。

    但是,当我在中产阶级中重写这个函数时,它被调用。但这让人困惑:让我们用一幅图来解释一下:)

    • 李吉斯

      • 类屏幕
        • 虚函数初始值设定项
    • 库TigerControlRoot

      • bTigerScreen类
        • 重写函数初始值设定项
    • lib-tigercontrolrootcommons屏幕
      • 类检查规则
        • 重写函数初始值设定项<--未调用:s

    但是会调用构造函数…

    这是我的(简化)代码:

    共享的基类

    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]' violates the constraint of type parameter 'T'.

    在另一个项目中使用了具有相同guishard lib的类似代码,并且没有问题。

    1 回复  |  直到 16 年前
        1
  •  4
  •   Stormenet    16 年前

    好的,谢谢所有的回复,但我同时修正了。

    问题如下: 失败的类位于一个dll中,从该dll将调试模式下的输出路径设置为可执行文件的插件文件夹。到目前为止没有问题,但它也会将依赖项复制到该文件夹中。
    但是,一些依赖项已经复制到可执行文件的根文件夹中。启动时可执行文件搜索插件文件夹中的所有插件,并在需要时实例化插件。
    问题是插件使用plugin s文件夹中的依赖项,而可执行文件使用根文件夹中的依赖项,根文件夹在不同的目录中基本上是相同的文件,因此运行clr时会将它们视为2个不同的dll,这真的会混淆clr:。

    因此,当共享依赖项没有被复制到plugins文件夹中时,一切都会正常运行,因为插件使用根文件夹中的depedenties,从而使用相同的dll。