2009-07-24 8 views
22

tengo problemas para entender los errores subyacentes con el código de abajo:¿Cuál es el punto de un método estático en una clase no estática?

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? 

    } 
} 

no puedo nunca pensar en una razón por qué se podría declarar un método estático en una clase no estática, así que por qué no va a .NET lanzar un error de excepción.

Además,

moc.print("vhhhat?"); 

Esto va a decir que no puedo acceder método estático en el contexto no estática sino Prueba y principal son estáticos, lo que se refería?

+0

Véase 'XmlReader.Create' para un ejemplo de un método estático en una clase no estática. –

+5

El problema es que los nombres son malos. Un "método estático" realmente debería llamarse algo así como un "método compartido", como lo es en VB. Una clase es un modelo para la construcción de objetos, pero las clases estáticas no son construibles, por lo que no deberían llamarse clases. Nuevamente, VB lo hace bien, y los llama "módulos". Cuando los nombres son descriptivos, responder la pregunta se vuelve más fácil. Su pregunta es: ¿por qué tendría un "método compartido" que está en una clase, no en un módulo? Respuesta: Para compartirlo entre las instancias de su clase. –

Respuesta

21

Una clase estática significa que no puede usarla en un contexto no estático, lo que significa que no puede tener una instanciación de objeto de esa clase y llamar al método. Si desea utilizar el método de impresión que tendría que hacer:

myOtherClass.print("vhhhat?"); 

Esto no es estático, como se ha creado una instancia de la clase llamada moc:

myOtherClass moc = new myOtherClass(); 
0

Cuando se llama a un método en una instancia de objeto lo está llamando en un contexto no estático. No tiene importancia en qué método haces esto.

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 ?

Esto se refiere al hecho de que se está haciendo referencia a un método estático (myOtherClass.print) usando una instancia (MOC). Debería volver a procesar esto para que sea:

myOtherClass.print("vhhhat?"); 

Eso se compilará correctamente.

Los métodos estáticos son métodos que funcionan en la clase en sí, no una instancia específica de la clase. Esto tiene muchos usos; un ejemplo es para implementar el Factory method pattern.

3

En algún momento el "objetivo" de la función es particular de la clase en lugar del objeto (instancia de la clase).

Por ejemplo, un método de fábrica:

SomeClass obj = SomeClass.CreateInstance(); 

Esto es más evidente cuando el lenguaje tiene instalaciones metaprogramación que permiten operaciones en clases. En Python, esta distinción se hace más explícita por convención: el primer parámetro que se pasa a una función se llama algo así como "cls" o "self" e indica que la función puede operar en la clase (cuando es un "método de clase") o la instancia (el tipo al que está más acostumbrado, cuando es un método de instancia).

8

En primer lugar, el error:

moc.print("vhhhat?"); 

está tratando de llamar a un método estático en una instancia de la clase (es decir, un contexto no estática). Para llamar correctamente print(), que haría

myOtherClass.print("vhhhat?"); 

Para la primera pregunta, hay muchas razones para tener métodos estáticos en una clase no estática. Básicamente, si hay una operación asociada con la clase, pero no con ninguna instancia particular de la clase, debe ser un método estático. Por ejemplo, String.Format() (o cualquiera de los métodos estáticos de String) no deberían operar en instancias de cadenas, pero deberían estar asociados con la clase String. Por lo tanto, son estáticos.

0

El programa correcto sería: -

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


    } 
} 
Cuestiones relacionadas