ADO.NET データプロバイダのインタフェースとクラス階層に八つ当たる
例えばADO.NETデータプロバイダ上で使える、oracleで使用するのと殆ど同じだが少しだけ違うカスタムなSQLパラメタとそのコレクションを用意したいと思う。使うインタフェースはVisual Studioのデザイナサポートを無視した単純なプロバイダの実装ならば
System.Data.IDataParameter System.Data.IDataParameterCollection
この二つを書けば良いはずだ。しかし両方とも最小限のメソッドしか定義されていない上に、IDbCommandインタフェースを実装する具象クラスはこのインタフェースを直接扱わず抽象クラスである
System.Data.DbParameter System.Data.DbParameterCollection
を扱う。これらは抽象クラスなので実装はスカスカであり、継承するためには全てを実装しなくてはならない。それはだるいので元々OracleClientで使用しているクラスである、
System.Data.OracleClient.OracleParameter System.Data.OracleClient.OracleParameterCollection
これらをベースに書けば楽だぞと、
public class HogeParameter : System.Data.OracleClient.OracleParameter {} public class HogeParameterCollection : System.Data.OracleClient.OracleParameterCollection {}
これらの継承クラスを用意すると
「ブッブー!! sealedなので継承できません !!」
と怒られるのだった。ちなみにSystem.Data.OracleClientではなくSystem.Data.OleDbにしても結果は同じである。
このような階層のクラスライブラリィの場合、基本インタフェースを実装しただけではどちらにしろ使い物にならないのだから、せめて(抽象クラスの)デフォルト実装を提供してくれるか、さもなくばSystem.Data.OleDb位は継承可能にしておいてくれよ、と思うのは私だけだろうか。
そもそもこれら(System.Data.DbParameter及びSystem.Data.DbParameterCollectionを継承した)具象クラスはなんのためにsealedになっているんだ。内製されたクラスライブラリィであれば書いたプログラマにお願いしてsealedを外して貰えば良いが、相手がMicrosoftじゃお手上げだ。
と愚痴をこぼしたが下手にADO.NETに対応しようとするから複雑になる訳で、やりたいことは外部からのSQLファイルの読み込みとパラメタのバインドだけなので、ADO.NETとは全然関係の無い所で実装することにしたら100倍シンプルになった。