2009-07-24 12 views
22

Ho difficoltà a capire gli errori sottostanti con il codice qui sotto:Qual è il punto di un metodo statico in una classe non statica?

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? 

    } 
} 

non riesco mai a pensare a una ragione per la quale si potrebbe dichiarare un metodo statico in una classe non statica, quindi perché non voglio NET genera un errore di eccezione.

Inoltre,

moc.print("vhhhat?"); 

Ciò dire che non posso accedere al metodo statico in un contesto non statico, ma prova e principale sono statici, che cosa sta riferendo?

+0

Vedi 'XmlReader.Create' per un esempio di un metodo statico in una classe non statica. –

+5

Il problema è che i nomi sono cattivi. Un "metodo statico" in realtà dovrebbe essere chiamato qualcosa come un "metodo condiviso", come lo è in VB. Una classe è un progetto per la costruzione di oggetti, ma le classi statiche non sono costruibili, quindi non dovrebbero essere chiamate classi. Di nuovo, VB ha capito bene e li chiama "moduli". Quando i nomi sono descrittivi, rispondere alla domanda diventa più semplice. La tua domanda è: perché dovresti avere un "metodo condiviso" che è in una classe, non in un modulo? Risposta: per condividerlo tra istanze della sua classe. –

risposta

21

Una classe statica indica che non è possibile utilizzarlo in un contesto non statico, ovvero che non è possibile avere un'istanza di oggetto di tale classe e chiamare il metodo. Se si voleva utilizzare il metodo di stampa si dovrebbe fare:

myOtherClass.print("vhhhat?"); 

Questo non è statico, come si è creato un'istanza della classe chiamata moc:

myOtherClass moc = new myOtherClass(); 
0

Quando si chiama un metodo di su un'istanza dell'oggetto si sta chiamando in un contesto non statico. Non è importante in quale metodo lo fai.

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 ?

Questo si riferisce al fatto che si sta fa riferimento a un metodo statico (myOtherClass.print) utilizzando un'istanza (MOC). Dovresti rileggere questo per essere:

myOtherClass.print("vhhhat?"); 

Che verrà compilato correttamente.

I metodi statici sono metodi che funzionano sulla classe stessa, non un'istanza specifica della classe. Questo ha molti usi: un esempio è per l'implementazione dello Factory method pattern.

3

A volte l '"obiettivo" della funzione è specifico della classe piuttosto che dell'oggetto (istanza della classe).

Ad esempio, un metodo di fabbrica:

SomeClass obj = SomeClass.CreateInstance(); 

Questo è più evidente quando la lingua dispone di strutture di metaprogrammazione che consentono operazioni su classi. In Python, questa distinzione è resa più esplicita dalla convenzione: il primo parametro passato a una funzione è chiamato qualcosa come "cls" o "self" e indica che la funzione potrebbe operare sulla classe (quando è un "metodo di classe") o l'istanza (il tipo a cui sei più abituato, quando si tratta di un metodo di istanza).

8

Innanzitutto, l'errore:

moc.print("vhhhat?"); 

tenta di chiamare un metodo statico su un'istanza della classe (cioè un contesto non statico). Per chiamare correttamente print(), si farebbe

myOtherClass.print("vhhhat?"); 

Per la prima domanda, ci sono molte ragioni per avere metodi statici in una classe non statica. In sostanza, se esiste un'operazione associata alla classe, ma non con una particolare istanza della classe, dovrebbe essere un metodo statico. Ad esempio, String.Format() (o uno qualsiasi dei metodi statici String) non dovrebbe operare su istanze di stringa, ma dovrebbero essere associati alla classe String. Pertanto sono statici.

0

Il programma corretto sarebbe: -

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


    } 
} 
Problemi correlati