Stavo attraversando il libro di programmazione del Martin Odersky a Scala con la sua sezione sui moduli astratti, e la sua carta Scalable componenti Astrazioni:Moduli astratti alla scala in C# o in altre lingue?
http://lampwww.epfl.ch/~odersky/papers/ScalableComponent.pdf
mio asporto è che, rendendo i moduli classi astratte invece di oggetti (o classici , moduli globali statici come in Java):
abstract class myModule{
// this is effectively an abstract module, whose concrete
// components can be configured by subclassing and instantiating it
class thing{}
class item{}
object stuff{}
class element{}
object utils{}
}
puoi creare istanze multiple di sottoclassi e istanze di un modulo con differenti caratteristiche concrete. Ciò consente di configurare il modulo in modo diverso a seconda delle circostanze (ad esempio sostituendo il componente del database durante il test o il componente IO quando si trova in un ambiente di sviluppo) e istanziando più moduli ciascuno con il proprio insieme di stato mutabile nell'ambito del modulo.
Da quello che posso capire, a livello di base, è solo un requisito rigido che è possibile avere classi nidificate, in modo tale che la classe che le include possa agire come un modulo.
È un altro requisito pratico è che è possibile distribuire la definizione della classe su più file, dal momento che un modulo con un gruppo di classi in esso è probabilmente più linee di codice di quanto la maggior parte accetterebbe in un singolo file sorgente.
Scala esegue questa operazione con Tratti, che apportano altre chicche che sono carine ma non centrali per l'intero spread abstract-module-class su più file di origine idea. C# ha partial classes
, che fornisce la stessa funzionalità e consente anche classi annidate. Presumibilmente alcune altre lingue hanno un supporto simile per le classi annidate, oltre a dividere una classe su più file.
Questo tipo di schema si verifica ovunque in C# o in altre lingue? Penserei che i progetti di grandi dimensioni in molte lingue affrontino il problema che i moduli astratti sono pensati per risolvere. C'è qualche ragione per cui questa cosa di "classe astratta come modulo astratto" non funzioni, e quindi non viene usata? Mi sembra una soluzione molto più pulita rispetto ai vari framework DI con l'offerta della stessa funzionalità.
Penso che tu sia sfortunato, e il motivo è un fraintendimento: ** le classi parziali non hanno nulla a che vedere con i tratti **. Le classi parziali sono semplicemente un modo di diffondere una definizione di classe su più file, mentre i tratti sono un meccanismo potente (e non esistente in C#) del sistema di tipi./EDIT O forse no, se hai solo bisogno del meccanismo fornito da classi parziali. –
Il mio punto è che sebbene i tratti ti permettano di fare ogni sorta di cose belle con i tuoi moduli astratti, il nocciolo della cosa 'class-as-abstract-module' richiede solo la possibilità di nidificare classi e diffonderle su più file. Potrei sbagliarmi completamente, quindi per favore correggimi se lo sono. –