2007年11月13日火曜日

[.NET]virtualと非virtual

最近の作業で、log4netのRollingFileAppenderの拡張をしました。
で、改修ポイントを調査し、該当のメソッドをoverwriteし実装を完了しました。
その後、テストすると思うように動作しない。そこでブレイクポイントで待っているとなぜかブレイクしない。調べてみると、RollingFileAppender(継承元クラス)の該当メソッドが呼び出されていることがわかりました。

該当のメソッドは非virtualメソッドであり、拡張したクラスから呼び出された場合は拡張したクラスの該当メソッドが呼び出されますが、RollingFileAppenderから該当メソッドを呼んだ場合はRollingFileAppenderの該当メソッドが呼ばれることがわかりました。
そうなんです。C#ではデフォルトでメソッド呼び出しは非virtualなのです。

もともと私はJavaからC#にはいった経緯があり、Javaと同じ(デフォルトvirtual)つもりで実装してしまっていました。
ここは難易度の高いところだったのでヒヤヒヤでしたが、他の方法で機能は実現できたのでよしとしておこう。

0 件のコメント: