オープンクラスってC#でも理論的に実現は可能と言ってみるテスト

もちろん条件付でですけど.その条件は基底クラスがpartialで宣言されてたらですけど.だから現状では無理ですよ.

論よりソースって事で.まず,Rubyオープンクラス.簡単に書くと継承しなくてもメソッドを追加できるってところでしょうか.たぶんこの部分がプログラマを信頼しているって部分に当たるのな.まだその境地にはたどり着いていないみたいですが・・・.

実際に書いてみると,Stringクラスにhogeメソッドなんて無いので怒られます.

irb(main):001:0> "bobbyjam99".hoge
NoMethodError: undefined method `hoge' for "bobbyjam99":String
        from (irb):1

怒られたままだと困るので,メソッドを追加してみる.

irb(main):002:0> class String
irb(main):003:1>  def hoge
irb(main):004:2>   "hoge method is called.".display
irb(main):005:2>  end
irb(main):006:1> end
=> nil
irb(main):007:0> "bobbyjam99".hoge
hoge method is called.=> nil

というとちゃんとhogeメソッドが追加されたことが確認できました.

これをC#でも実装してみましょう.最初にも書いたようにpartialで宣言されていることが必要です.全部は見てないので基底クラスはpartialでないのでここでは仮に以下のような基底クラスが宣言されていると仮定しましょう.

public partial class StringHoge {
  public void display(String str) {
    System.Console.WriteLine(str);
  }
}

実行クラスはこんな感じ.最後の1行はメソッドの宣言してないのでもちろんコンパイルエラーになります.

class Program {
  public static void Main(string[] args) {
    StringHoge hoge = new StringHoge();
    hoge.display("bobbyjam99");  // bobbyjam99と表示
    hoge.hoge();                 // そんなメソッドないのでエラー
  }
}

hogeメソッドを別ファイルで追加します.同じファイルだとオープンクラスっぽくないので.

public partial class StringHoge {
  public void hoge() {
    System.Console.WriteLine("hoge method is called.");
  }
}

そしてさっきの実行クラスを実行するとうまく表示できました.

class Program {
  public static void Main(string[] args) {
    StringHoge hoge = new StringHoge();
    hoge.display("bobbyjam99");  // bobbyjam99と表示
    hoge.hoge();           // hoge method is called.と表示
  }
}

ということでC#でもpartialを利用すればオープンクラスが実現できそうな感じです.他にも弊害はあるかもしれないけど他の言語でもオープンクラスが出来るかもしれないねって話だけです,はい.

追記:
Marzさんのところで言及されていたYo!!
C#3.0では使えるようになるそうです.ちゃんちゃん.