Chiamando il metodo statico dall'istanza della classe

4

Come sviluppatore sono appassionato di metodi statici.

Recentemente mi sono imbattuto in differenze tra i linguaggi OOP su questi metodi statici.

Tutti i linguaggi OOP utilizzano il metodo statico per accedere a qualsiasi metodo senza creare un'istanza della classe. Quindi possiamo chiamare questo tipo di metodo solo con il nome della classe.

Ma alcuni linguaggi consentono di accedere al metodo statico dalla variabile di istanza anche come Java e ad alcuni non piace Objective - C.

Quindi qual è la ragione di questo tipo di differenza tra due linguaggi OOP? Qual è il comportamento corretto di OOP? Sono solo curioso di sapere questo.

    
posta CRDave 17.05.2014 - 09:53
fonte

1 risposta

8

I metodi statici non hanno nulla a che fare con OOP al suo interno. Se Java non avesse istanze di classi, questo sarebbe un esempio di programmazione modulare con classi che sono moduli e metodi statici sono procedure ordinarie.

La differenza qui rilevante tra Java e Objective-C è che quest'ultimo ha un protocollo metaobject : le classi stesse sono oggetti normali. Un oggetto foo può essere un'istanza di un FooClass che alla fine è un'istanza (! = Sottoclasse) di NSObject . Quando invochiamo un metodo su una classe, inviamo questo messaggio all'oggetto reale che rappresenta quella classe. In Java, chiamare un metodo statico non coinvolge affatto gli oggetti, è solo una chiamata alla procedura (e può essere completamente risolta prima del runtime - no è necessaria la spedizione dinamica ).

In Java, le classi non sono reified oltre la riflessione. Quindi, il tipo di instance.staticMethod() ha senso, in quanto non può significare nient'altro (capita solo di condividere la sintassi per le normali chiamate di metodo, ma il metodo statico viene esaminato solo in base al tipo statico della variabile instance :

class Super {
    public static void staticMethod() { return; }
}
class Instance extends Super {
}

Instance instance = new Instance();
instance.staticMethod();  // doesn't work
((Super) instance).staticMethod(); // works with cast

L'obiettivo-C non ha tali "metodi statici", ma ha:

  • metodi di classe , che assomigliano a metodi statici se ti strizzi gli occhi. Sarebbe molto confuso se una chiamata di metodo su un'istanza finisse per essere una chiamata di metodo su una classe (un altro oggetto tutto insieme), quindi non esiste una scorciatoia sintattica come [instance staticMethod] , che non risparmia nemmeno molto su [[instance class] staticMethod] . Tali metodi di classe sono utili per i costruttori e altri metodi di produzione. Tuttavia, non sono "statici" in quanto sono soggetti all'ereditarietà.

  • semplici vecchie funzioni C . Esistono al di fuori di oggetti e classi e non sono soggetti a un invio dinamico, il che li rende interessanti anche dal punto di vista delle prestazioni. Questi sono "statici" nel senso proprio di quella parola, ma non sono "metodi".

risposta data 17.05.2014 - 10:41
fonte

Leggi altre domande sui tag