Interface・抽象クラス継承の際の制限事項

3つの補間法(ラグランジュ補間、スプライン補間、最小二乗法を用いた多項式近似での補間)をそれぞれ異なる静的クラスとして実装しようと考えた。で、どれも内部での計算方法が違うだけで、取る引数・返り値は同じ形式なため、Interpolationって抽象クラスorインターフェースを作って各々のクラスに継承させようとしたんだけど・・・。

抽象クラスを作って継承させようとした場合

静的クラスの制限に加え、override修飾子の制限からコンパイルエラーになった。
具体的には、前者は『静的クラスはオブジェクトから派生しなければなりません。』ってエラーが出た。これはヘルプに

この操作が仮に許可されていると、静的クラスが基本クラスのメソッドおよび非静的なメンバを継承できることになり、その点で静的とは言えなくなってしまいます。

って、エラーとなる理由が書かれている。確かにそういう場合はモットもなんだけど、今回使おうとしたような抽象クラスなら問題は起きないような気がするんだけど・・・。自分自身このへん十分理解してるとはいえないので、まぁ、そういうもんなのかと納得することにする。

話は戻って、後者のエラーについては

http://msdn.microsoft.com/ja-jp/library/ebca9ah3.aspx

override メソッドの修飾に、修飾子 new、static、virtual、または abstract は使用できません。

ってことらしい。

インターフェースを作って継承させようとした場合

ヘルプを引用すると、

インターフェイスは、オブジェクトに対して非静的なメソッドを定義するため、静的なクラスがインターフェイスを実装することはできません。

ってことで、ダメらしい。インターフェイスのメソッドって、何も書いてないのに非静的(staticではない?)とみなされるのか…。

ってことで強引にまとめると

staticクラスは完全に他のクラスから独立させておけってこと、かなぁ。
静的クラスの制限を除いて、言語仕様を決めた人がエラーとした動機がわからないので、なんか気持ち悪いけど、今回の問題の発端である"補間法を別々の静的クラスに実装する"なんてのは特にそうする理由もないし、まぁ適当に組み直すか。