前提
同じインターフェイスを継承したクラスがあります。
そのクラス群に対してそれぞれ拡張メソッドを実装したのですが、
インターフェイスに対しての拡張メソッドを参照してしまい多態性を実現できません。
C#
1 public interface InterFace {} 2 3 public class A : InterFace {} 4 public class B : InterFace {} 5 6 public static class Extension 7 { 8 public static string func(this InterFace i) {return "インターフェイス";} 9 public static string func(this A a) {return "クラスA";} 10 public static string func(this B a) {return "クラスB";} 11 } 12 13 public class Program 14 { 15 public static void test<T>(T t) where T : InterFace 16 { 17 //InterFaceに実装されている拡張メソッドが呼び出されてしまう。 18 Console.WriteLine(t.func()); //出力 : インターフェイス 19 } 20 }
実現したいこと
インスタンスメソッドのように拡張メソッドを使いたいです。
実際のコードではClass A・B には触れないので直接メソッドを追加できない状態です。
if文・switch文などで条件分岐を設定するしかないのでしょうか?
多様性というのは多態性のことですか?
実メソッドは拡張メソッドに優先されるので、InterFace 以外の拡張メソッドをやめ、そのメソッドをクラスに実装すればいいと思います。
多態性の事です。誤字ってました...
実際はUnityでのコードなのですが、クラスA・BはUnity標準クラスなので直接クラスを追加できないため拡張メソッドを使用していました。
拡張メソッドはむやみに使うものではありません。それらのクラスを引数とするメソッドを作るのが良いと思います。
この質問に書いてあることが事実なら、拡張メソッドにしなければならない場合は、実行時に分岐する他ないでしょう。
実際に行いたいことによっては、もっと良い方法がありそうな気配を感じます。
しかし本来、引数の優先度が高いメソッドの方が優先して呼ばれるはずです。タイポなど何かそれを妨げる要素がないか確認してみてください。
dynamicを使うハック?がありますが、Unityだとどうなんでしょうね。
[c# - Polymorphism Through Extension Methods? - Stack Overflow](https://stackoverflow.com/questions/20707317/polymorphism-through-extension-methods)
UnityのAPI互換レベルがデフォルトだと.NET Standard2.1なのでdynamicを使用するとコンパイルエラーが出てしまう為、.NET Frameworkに変更して試してみたところ動作しました!
一応Unity限定の注意点ですが、dynamic はセキュリティの都合上、特定のハードウェアで
動作しないのでご注意ください。
※ビルドはできても、実行時にエラーになります。
回答2件
あなたの回答
tips
プレビュー