オープンクラスって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では使えるようになるそうです.ちゃんちゃん.