J'ai un problème étrange dans mon projet. J'ai une classe qui hérite d'une classe de base (qui hérite à nouveau d'une autre classe de base) et remplace une fonction. Cependant, lorsque cette fonction est appelée, elle n'appelle jamais la fonction surchargée, mais la fonction de base.Fonction virtuelle ignorée non appelée
Cependant, lorsque je remplace cette fonction dans la classe moyenne, elle est appelée. Mais cela est source de confusion: nous allons expliquer avec un dessin :)
lib GuiShared
- classe BSCREEN
- fonction virtuelle InitializeRoc
- classe BSCREEN
lib TigerControlRoot
- classe bTigerScreen
- override InitializeRoc < - quand il overriden ici est appelé
- classe bTigerScreen
- lib TigerControlRootCommonScreens
- CheckInRules classe
- override InitializeRoc < - pas appelé: de
- CheckInRules classe
Le constructeur est appelé ... Mais
Voici mon (simplifié) Code:
La base commune classe
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) { }
}
}
classe de base projet
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();
}
}
}
La classe d'échec (ou de toute autre classe de cette 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);
}
}
}
Et si cela ne suffisait pas, quand je tente d'appeler une fonction de la classe de base I recevez une exception TypeLoadException.
GenericArguments[0], 'TigerMiddleware.TigerRoc.Tiger', on 'Ppb.GuiShared.bMain`1+LoadEventArgs[T]' violates the constraint of type parameter 'T'.
Un code similaire avec le même GuiShared lib est utilisé dans un autre projet et il n'y a pas de problèmes.
Veuillez fournir un programme court mais complet (de préférence une application de console) pour démontrer le problème. Les extraits que nous avons en ce moment ne sont pas vraiment clairs (pour moi, de toute façon). –
Pouvez-vous nous montrer la définition de TigerMiddleware.TigerRoc.Tiger? –