2009-07-24 4 views
22

У меня есть проблемы с пониманием основные ошибки с кодом ниже:Что такое статический метод в нестационарном классе?

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?"); 

Это сказать, что я не могу получить доступ к статическому методу в не статическом контексте, но испытания и основных являются статическим, что это в виде?

+0

Смотрите 'XmlReader.Create' для примера статического метода в нестационарном классе. –

+5

Проблема в том, что имена плохие. «Статический метод» действительно должен называться чем-то вроде «общего метода», как в VB. Класс является планом построения объектов, но статические классы не являются конструктивными, поэтому их нельзя называть классами. Опять же, VB понимает это правильно и называет их «модулями». Когда имена являются описательными, ответы на вопрос становятся проще. Ваш вопрос: почему у вас есть «общий метод», который находится в классе, а не в модуле? Ответ. Чтобы поделиться им между экземплярами своего класса. –

ответ

21

Статический класс означает, что вы не можете использовать его в нестационарном контексте, что означает, что вы не можете создать объект-экземпляр этого класса и вызвать метод. Если вы хотите использовать ваш метод печати вы должны сделать:

myOtherClass.print("vhhhat?"); 

Это не статично, как вы создали экземпляр класса под названием moc:

myOtherClass moc = new myOtherClass(); 
0

При вызове методы на объекте объекта вы вызываете его в нестационарном контексте. Не важно, в каком методе вы это делаете.

11

This will say I can't access static method in non static context but Test and main are static, what is it referring to ?

Это относится к тому, что вы ссылаетесь статический метод (myOtherClass.print), используя экземпляр (МОЦ). Вам необходимо будет доработать следующее:

myOtherClass.print("vhhhat?"); 

Это будет скомпилировано правильно.

Статические методы - это методы, которые работают над самим классом, а не конкретным экземпляром класса. Это имеет много применений - один пример для реализации Factory method pattern.

3

Иногда «объектив» функции относится к классу, а не к объекту (экземпляр класса).

Например, фабричный метод:

SomeClass obj = SomeClass.CreateInstance(); 

Это более очевидно, когда язык имеет метапрограммирования средства, позволяющие операции по классам. В Python это различие делается более явным по соглашению: первый параметр, переданный функции, называется либо «cls», либо «self» и указывает, что функция может работать в классе (когда это «метод класса») или экземпляр (тип, к которому вы больше привыкли, когда это метод экземпляра).

8

Во-первых, ошибка:

moc.print("vhhhat?"); 

пытается вызвать статический метод на примере класса (т.е. нестатический контекст). Для того, чтобы правильно назвать печать(), вы могли бы сделать

myOtherClass.print("vhhhat?"); 

Для первого вопроса, то есть много причин, чтобы иметь статические методы в нестатической классе. В принципе, если есть операция, связанная с классом, но не с каким-либо конкретным экземпляром класса, это должен быть статический метод. Например, String.Format() (или любой из статических методов String) не должен работать с экземплярами строк, но они должны быть связаны с классом String. Поэтому они статичны.

0

Правильная программа будет: -

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"); 


    } 
} 
Смежные вопросы