読者です 読者をやめる 読者になる 読者になる

雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

dynamic を使ってちょっと遊んでみた

C#

ダックタイピング的な何か。
……コンパイル時チェックが走らないからバグの温床になりそうな気はするけど。 :p

// A, B, C はともに Some() メソッドを持っている
// でもそれぞれにつながりはない(インターフェース継承とかはしていない)
class SampleA {
  public string Some() {
    return "SampleA.Some()";
  }
}

class SampleB {
  public string Some() {
    return "SampleB.Some()";
  }
}

class SampleC {
  public string Some() {
    return "SampleC.Some()";
  }
}

class Foo {
  static void Hoge(dynamic item) {
    // dynamic で受けた引数の Some() メソッドを呼び出す
    Console.WriteLine("{0} <{1}> を呼びました。", item.Some(), item.GetType());
  }

  static void Main() {
    Hoge(new SampleA());
    Hoge(new SampleB());
    Hoge(new SampleC());
  }
}
SampleA.Some() <SampleA> を呼びました。
SampleB.Some() <SampleB> を呼びました。
SampleC.Some() <SampleC> を呼びました。

# 元々は、型安全な可変長引数が欲しかったのですよ。
# Tuple は要素数が 8 個を超えるとかなり使いにくいし、パラメータ名が気に食わないので(以下略。
# でも、それはさすがに厳しそう。。。