Какова точка статического метода в нестационарном классе?
Мне трудно понять основные ошибки с помощью кода ниже:
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 являются статическими, что это значит?
Ответы
Ответ 1
Статический класс означает, что вы не можете использовать его в нестационарном контексте, что означает, что вы не можете создать экземпляр объекта этого класса и вызвать метод. Если вы хотите использовать свой метод печати, вам нужно будет:
myOtherClass.print("vhhhat?");
Это не статично, поскольку вы создали экземпляр класса moc
:
myOtherClass moc = new myOtherClass();
Ответ 2
Это скажет, что я не могу получить доступ к статическому методу в нестационарном контексте, но Test и main являются статическими, что это значит?
Это относится к тому факту, что вы ссылаетесь на статический метод (myOtherClass.print), используя экземпляр (moc). Вам придется переработать это следующим образом:
myOtherClass.print("vhhhat?");
Это будет правильно составлено.
Статические методы - это методы, которые работают над самим классом, а не конкретным экземпляром класса. Это имеет много применений - один пример для реализации шаблона Factory.
Ответ 3
Во-первых, ошибка:
moc.print("vhhhat?");
пытается вызвать статический метод для экземпляра класса (т.е. нестатического контекста). Чтобы правильно вызвать print(), вы сделали бы
myOtherClass.print("vhhhat?");
Для первого вопроса есть много причин, чтобы статические методы выполнялись в нестационарном классе. В принципе, если есть операция, связанная с классом, но не с каким-либо конкретным экземпляром класса, это должен быть статический метод. Например, String.Format() (или любой из статических методов String) не должны работать со строковыми экземплярами, но они должны быть связаны с классом String. Поэтому они являются статическими.
Ответ 4
Когда-то "объектная" функция специфична для класса, а не для объекта (экземпляр класса).
Например, метод factory:
SomeClass obj = SomeClass.CreateInstance();
Это более очевидно, когда язык обладает средствами метапрограммирования, которые позволяют выполнять операции над классами. В Python это различие делается более явным по соглашению: первый параметр, переданный функции, называется либо "cls", либо "self" и указывает, что функция может работать в классе (когда это "метод класса" ) или экземпляр (тип, к которому вы больше привыкли, когда это метод экземпляра).
Ответ 5
Вот хороший пример того, как использовать статические методы в нестационарном классе:
Обратные вызовы ASP.NET AJAX к веб-методам на страницах ASPX
Ответ 6
Когда вы вызываете метод в экземпляре объекта, вы вызываете его в нестационарном контексте. Это не имеет никакого значения, в каком методе вы это делаете.