プロジェクトに奇妙な問題があります。基本クラスから継承し (これも別の基本クラスから継承します)、関数をオーバーライドするクラスがあります。ただし、その関数が呼び出されると、オーバーライドされた関数は呼び出されず、基本関数が呼び出されます。
ただし、中間クラスでその関数をオーバーライドすると、呼び出されます。しかし、これは紛らわしいです: 図面で説明しましょう :)
lib GuiShared
- クラス bScreen
- 仮想関数 InitializeRoc
- クラス bScreen
lib TigerControlRoot
- クラス bTigerScreen
- override function 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'、'Ppb.GuiShared.bMain`1+LoadEventArgs[T]' は、型パラメーター 'T' の制約に違反しています。
同じ GuiShared ライブラリを使用した同様のコードが別のプロジェクトで使用されており、問題はありません。