- 410 名前:デフォルトの名無しさん mailto:sage [2016/08/28(日) 09:59:05.95 ID:+mkoP4gZ.net]
- (B)は通常メソッドで、SubClassが与えられると当然SubClassのメソッドが呼ばれる。
ただし(A)は常にSampleClass1(親クラスというより「そこに記述された」クラス)の拡張メソッドが呼ばれる。 なお(C)はSampleClass1の拡張メソッドが呼ばれる。 (つまり子→親に関しては辿れる) (B)が動作する以上、thisポインタは正しく渡っている。 あとは拡張メソッド側に継承関係を明記し、実行時型でこれを解決すれば良いだけなのだけど、 C#はどうやら文法的にこれを禁止している。(技術的には全く問題なく出来るはず) 今回出来ないのは、拡張メソッドがstaticだからコンパイル時にそこにリンクされるからだ。 そこでvirtual指定してみたが、これはSyntacErrorで落ちる。 どうやらそれ以前にC#は静的クラスは継承禁止で、当然virtualには出来ない。 しかしそもそも静的クラスが継承出来ないのが問題だ。 何故これを禁止しなければならないのかは分からない。 結局>>378の「static縛り」或いは上記「staticクラスは継承出来ない」のが問題。 とはいえこの仕様では「拡張メソッド」がイマイチなのはC#開発側も認識出来るだろうから、 何らかの理由があってこの仕様なのだとは思うが。 したがって>>364の指摘どおり、 > >>329で多態が必要なのに>>352は拡張メソッドでいいというのは矛盾してるよ。 これは間違いだった。拡張メソッドが多態出来ないのは知らなかったから。 となると>>352は ・Shapeクラスにメソッド追加---(α) ・GUI側でShapeクラスを継承したクラスを作って対応---(β) ・>>384方式で is XXXX 形式で全部書く---(γ) のどれかになるが、俺ならαかβであって、γはないね。
|

|