Questa è una grande domanda e una che ho incontrato nei miei progetti.
Alcune persone sostengono che le interfacce e le classi astratte esistono solo per il polimorfismo, non per forzare i tipi a implementare determinati metodi. Personalmente, considero il polimorfismo un caso d'uso primario e l'implementazione forzata una secondaria. Uso la tecnica di implementazione forzata abbastanza spesso. In genere, viene visualizzato nel codice framework che implementa un modello di modello. La classe base/template racchiude alcune idee complesse e le sottoclassi forniscono numerose varianti implementando i metodi astratti. Un vantaggio pragmatico è che i metodi astratti forniscono una guida ad altri sviluppatori che implementano le sottoclassi. Visual Studio ha persino la possibilità di eliminare i metodi per te. Ciò è particolarmente utile quando uno sviluppatore di manutenzione deve aggiungere una nuova sottoclasse mesi o anni dopo.
Lo svantaggio è che non esiste un supporto specifico per alcuni di questi scenari di modelli in C#. I metodi statici sono uno. Un altro è costruttori; idealmente, ISerializable dovrebbe forzare lo sviluppatore ad implementare il costruttore di serializzazione protetto.
L'approccio più semplice è probabilmente (come suggerito in precedenza) utilizzare un test automatico per verificare che il metodo statico sia implementato sui tipi desiderati. Un'altra idea praticabile già menzionata è l'implementazione di una regola di analisi statica.
Una terza opzione consiste nell'utilizzare un framework di programmazione orientato agli aspetti come PostSharp. PostSharp supporta la convalida degli aspetti in fase di compilazione. È possibile scrivere codice .NET che riflette sull'assembly in fase di compilazione, generando avvisi ed errori arbitrari. Solitamente, lo fai per verificare che un uso dell'aspetto sia appropriato, ma non vedo perché non potresti usarlo per validare anche le regole dei modelli.
fonte
2009-07-22 20:30:24
Perdonare la mia curiosità, ma non posso fare a meno di chiedermi perché avresti bisogno di una funzione come questa? Cosa hanno i metodi statici con i metodi di istanza ordinaria (non statici)? Nulla mi viene in mente. Hai voglia di condividere un contesto per la tua domanda? – Dan
Non è necessaria un'istanza per chiamare un metodo statico. Quindi sono piacevoli da usare come metodi di fabbrica, ad esempio un metodo de-serialize. – tpower
@Dan: un ulteriore utilizzo sarebbe la possibilità di utilizzare l'interfaccia senza sapere se si sta lavorando su un'istanza o un tipo (o modificandolo in seguito). Pensa a una classe statica che rappresenta una sorta di elenco singleton e che dovrebbe, come lista appropriata, implementare 'IList'. Certo, la soluzione alternativa per archiviare un'istanza di una classe che implementa 'IList ' nella classe statica è fattibile (e sono consapevole che C# al momento per ora lo consente solo in questo modo), ma la possibilità di dichiarare direttamente una classe come staticamente l'implementazione di un'interfaccia eliminerebbe un livello non necessario di riferimento indiretto. –