以下のコードで根本的なエラーを理解するのに問題があります:
class myClass
{
public void print(string mess)
{
Console.WriteLine(mess);
}
}
class myOtherClass
{
public static void print(string mess)
{
Console.WriteLine(mess);
}
}
public static class Test
{
public static void Main()
{
myClass mc = new myClass();
mc.print("hello");
myOtherClass moc = new myOtherClass();
moc.print("vhhhat?");
//This says I can't access static method in non static context, but am I not?
}
}
非静的クラスで静的メソッドを宣言する理由は考えられないので、なぜ.NETは例外エラーをスローしないのでしょうか。
さらに、
moc.print("vhhhat?");
これは、非静的コンテキストで静的メソッドにアクセスできないことを示しますが、Testとmainは静的です、それは何を指しているのですか?
静的クラスは、それを非静的コンテキストで使用できないことを意味します。つまり、そのクラスのオブジェクトインスタンスを作成してメソッドを呼び出すことはできません。印刷方法を使用したい場合は、次のようにする必要があります。
myOtherClass.print("vhhhat?");
moc
というクラスのインスタンス化を作成したため、これは静的ではありません。
myOtherClass moc = new myOtherClass();
これは、非静的コンテキストで静的メソッドにアクセスできないことを示しますが、Testとmainは静的です、それは何を指しているのですか?
これは、インスタンス(moc)を使用して静的メソッド(myOtherClass.print)を参照していることを示しています。これを次のように書き直す必要があります。
myOtherClass.print("vhhhat?");
それは正しくコンパイルされます。
静的メソッドは、クラスの特定のインスタンスではなく、クラス自体で機能するメソッドです。これには多くの用途があります。1つの例は Factory method pattern の実装です。
まず、エラー:
moc.print("vhhhat?");
クラスのインスタンス(つまり、非静的コンテキスト)で静的メソッドを呼び出そうとしています。 print()を正しく呼び出すには、次のようにします
myOtherClass.print("vhhhat?");
最初の質問については、非静的クラスに静的メソッドがある理由はたくさんあります。基本的に、クラスに関連付けられている操作があり、クラスの特定のインスタンスに関連付けられていない場合、それは静的メソッドである必要があります。たとえば、String.Format()(または任意のString静的メソッド)は、文字列インスタンスでは動作しませんが、Stringクラスに関連付けられている必要があります。したがって、それらは静的です。
関数の「目的」は、オブジェクト(クラスのインスタンス)ではなく、クラスに固有の場合があります。
たとえば、ファクトリメソッド:
SomeClass obj = SomeClass.CreateInstance();
これは、言語にクラスの操作を可能にするメタプログラミング機能がある場合に、より明白になります。 Pythonでは、この区別は規則により明確になっています。関数に渡される最初のパラメーターは「cls」または「self」などの名前が付けられ、関数がクラスで動作する可能性があることを示します(「クラスメソッド」の場合)。またはインスタンス(インスタンスメソッドの場合、より慣れているタイプ)。
正しいプログラムは次のようになります:-
class myClass
{
public void print(string mess)
{
Console.WriteLine(mess);
}
}
class myOtherClass
{
public static void print(string mess)
{
Console.WriteLine(mess);
}
public void printMe(string mess)
{
Console.WriteLine(mess);
}
}
public static class Test
{
public static void Main()
{
myClass mc = new myClass();
mc.print("hello");
myOtherClass moc = new myOtherClass();
myOtherClass.print("vhhhat?");
moc.printMe("test me");
}
}
以下は、非静的クラスで静的メソッドを使用する場合の良い例です。
オブジェクトインスタンスでメソッドを呼び出す場合は、非静的コンテキストで呼び出します。どの方法でこれを行うかは重要ではありません。