Ich habe ein seltsames Problem in meinem Projekt. Ich habe eine Klasse, die von einer Basisklasse (die wiederum von einer anderen Basisklasse erbt) erbt und eine Funktion überschreibt. Wenn diese Funktion aufgerufen wird, ruft sie jedoch nie die überschriebene Funktion auf, sondern die Basisfunktion.Overridden virtuelle Funktion nicht
Allerdings, wenn ich diese Funktion in der Mittelklasse zu überschreiben, wird es aufgerufen. Aber das ist verwirrend: Lassen Sie uns mit einer Zeichnung erklären :)
lib GuiShared
- Klasse bEcran
- virtuelle Funktion InitializeRoc
- Klasse bEcran
lib TigerControlRoot
- Klasse bTigerScreen
- Überbrückungsfunktion InitializeRoc < - wenn hier außer Kraft gesetzt es
- Klasse bTigerScreen
- lib TigerControlRootCommonScreens
- Klasse CheckInRules
-
aufgerufen wird
- Überbrückungsfunktion InitializeRoc < - nicht aufgerufen: s
- Klasse CheckInRules
Der Konstruktor wird jedoch ...
meine (vereinfacht) Code hier genannt:
Die gemeinsame Basis Klasse
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) { }
}
}
Projekt Basisklasse
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();
}
}
}
die versagenden Klasse (oder eine andere Klasse von dieser 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);
}
}
}
Und wenn das nicht genug wäre, wenn ich versuche, eine Funktion auf der Basisklasse I zu nennen Erhalte eine TypeLoadException.
Ähnliche Code mit der gleichen GuiShared-Lib wird in einem anderen Projekt verwendet und dort gibt es keine Probleme.
Bitte geben Sie ein kurzes, aber vollständiges Programm an (vorzugsweise eine Konsolen-App), um das Problem zu demonstrieren. Die Schnipsel, die wir im Moment haben, sind nicht wirklich klar (jedenfalls für mich). –
Können Sie uns die Definition von TigerMiddleware.TigerRoc.Tiger zeigen? –