抽象クラスのExport属性は継承クラスで再設定が必要
MonoTouchとObjective-Cランタイムとの連携は,C#で書いたメソッドにObjective−Cから見た名前をExport属性で指定して行います.
抽象クラスでアニメーション終了時にExport属性をつけたメソッドを呼び出すようにコードを書いたのですが,その抽象クラスの継承クラスではアニメーション終了時にそのメソッドが呼び出されませんでした.継承クラスでそのメソッドをオーバライドしてExport属性をつけることで,期待したとおりにメソッドが呼び出されました.
http://monotouch.net/Documentation/Binding_New_Objective-C_Typesこのあたりのドキュメントを読んでみても,継承したときの振る舞いは解説されてはいないのですが, .Netでアセンブラから情報を読み出すときに使うReflectionは,メソッドなどの属性を読み出すときに,継承しているものを含むか含まないかを指定できます.ひょっとしたらExport属性は継承を見ないのかもしれません.
例) 例えば抽象クラスでExport属性をして:
abstract class SomeAbstractClass : UIView { [MonoTouch.Foundation.Export("_ScrollAnimationStoppedHandler")] protected virtual void _AnimationStopped() {} }
それを継承しただけでは,元の抽象クラスの_AnimationStopped()メソッドは呼び出されません.
class SomeImplementationClass : SomeAbstractClass
{}
継承クラスで再度_AnimationStopped()メソッドをオーバライドしてExport属性を指定すると,期待したとおり,メソッドが呼び出されます.
class SomeImplementationClass : SomeAbstractClass { [MonoTouch.Foundation.Export("_ScrollAnimationStoppedHandler")] protected override void _AnimationStopped() {} }