Perché sovrascrivere un metodo statico di una classe base astratta?

7

Sto lavorando al codice C # in cui un metodo statico di una classe base astratta viene sovrascritto dalla classe che eredita la classe base. Perché viene fatto questo? Ho pensato che solo un metodo virtuale di una classe base astratta dovrebbe essere sovrascritto. Quale scopo serve a rendere statico il metodo di base, o è il caso che ciò che sto incontrando è una pratica non ottimale o errata? Il codice è permesso dal compilatore.

La mia comprensione è che un metodo statico consente di chiamare il metodo senza che il tipo che comprende sia istanziato come oggetto. Ho usato solo metodi statici precedentemente in classi statiche e ho visto le classi astratte come semplicemente classi ereditabili che non dovrebbero essere istanziate. In questo caso, non mi aspetto che un metodo statico della classe astratta sia sovrascrivibile ma reso virtuale, in quanto un metodo virtuale potrebbe ancora contenere un'implementazione predefinita e penso che un metodo virtuale nasconda meglio i dettagli di implementazione.

    
posta Izzy 02.09.2015 - 09:24
fonte

2 risposte

13

Il sovraccarico di metodi statici non dovrebbe essere confrontato con l'override dei metodi di istanza. Sono concetti fondamentalmente diversi.

Overriding è quando le implementazioni di un metodo virtuale vengono selezionate in fase di esecuzione in base all'istanza. Sovraccarico avviene quando uno di più metodi con lo stesso nome viene selezionato in fase di compilazione . L'override è una caratteristica fondamentale del polimorfismo orientato agli oggetti, mentre l'overloading è più simile a una comodità.

In superficie, il sovraccarico di metodi statici può sembrare prioritario. Se il compilatore non trova un metodo statico nella classe specificata, cerca nella gerarchia dell'ereditarietà fino a quando viene trovato un metodo di corrispondenza. La differenza importante è che il metodo è risolto e risolto in fase di compilazione. Questo è il motivo per cui non puoi contrassegnare i metodi statici come virtual o override (o new ) poiché questa non è una sostituzione reale.

L'override dovrebbe essere conforme all'LSP (principio di sostituzione di Liskov) e più in generale il comportamento di un metodo prevalente dovrebbe essere conforme al contratto del metodo virtuale. I metodi statici sovraccaricati non hanno tali vincoli e dovrebbero essere in realtà dei metodi distinti che hanno lo stesso nome.

    
risposta data 02.09.2015 - 10:43
fonte
3

Oltre alla risposta eccellente (+1) di @ JacquesB-s

Why override overload a static method?

Ho visto casi di utilizzo in java in cui esistevano metodi di produzione statici

public class Customer {
   public static Customer newInstance(String name) {} ....

public class BusinessCustomer extends Customer  {
   public static BusinessCustomer  newInstance(String name) {} ....

Il motivo del sovraccarico è che entrambe le versioni newInstance () hanno la stessa firma in modo che possano essere facilmente scambiate in codice sorgente.

Customer customer1 = Customer.newInstance("peter");
Customer customer2 = BusinessCustomer.newInstance("paul");
    
risposta data 02.09.2015 - 12:56
fonte

Leggi altre domande sui tag