ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

C#ではインスタンスを通してstaticメソッドを呼べない

プログラミングC# p81

Javaプログラマ向け:C#では、インスタンスを通してstaticメソッドを呼び出すことはできません。

早速試してみた。

using System;

class StaticClass
{
        static void sMethod()
        {
                Console.WriteLine("static method.");
        }

        void iMethod()
        {
                Console.WriteLine("instance method.");
        }

        static void Main()
        {
                StaticClass sc = new StaticClass();
                sc.iMethod();
                //sc.sMethod(); // Error
                StaticClass.sMethod();
        }
}

コメントをはずしてコンパイルすると、こんなエラーになる。

static.cs(19,3): error CS0176: インスタンス参照でメンバ 'StaticClass.sMethod()'
        にアクセスできません。代わりに型名を使用してください。
static.cs(5,14): (以前のエラーに関連するシンボルの位置)

というわけで、全く想定の範囲内でした。
で、今度はJava

public class StaticClass
{
        static void sMethod()
        {
                System.out.println("static method.");
        }

        void iMethod()
        {
                System.out.println("instance method.");
        }

        public static void main(String[] args)
        {
                StaticClass sc = new StaticClass();
                sc.iMethod();
                sc.sMethod();
        }
}

これは何の文句も言われずコンパイル通るし、実行もできる。
インスタンスを通してクラスメソッド呼び出しって、やっぱり違和感あるなと。
で、Ruby
Rubyにそもそもクラスメソッドってあるんだっけ?とリファレンス見てみたら、
クラスメソッドの定義
ということで、それっぽいのがあった。早速コード書いて試してみる。ちなみに特異メソッド方式とかいうのでやってみた。

class StaticClass
                def StaticClass.sMethod
                                puts "class method."
                end

                def iMethod
                                puts "instance method."
                end
end

sc = StaticClass.new
sc.iMethod()
#sc.sMethod()  # Error
StaticClass.sMethod()

コメントはずすとこんなエラーになる。

StaticClass.rb:13:in `
': undefined method `sMethod' for # (NoMethodError)

sMethodは、StaticClassのものであって、StaticClassのインスタンスのものではないよということか。まんまだけど。