yo estaba pasando por programación el libro de Martin Odersky en Scala con ella es la sección de módulos abstractos, y su papel escalables de componentes abstracciones:¿Módulos abstractos de estilo Scala en C# u otros idiomas?
http://lampwww.epfl.ch/~odersky/papers/ScalableComponent.pdf
Mi comida para llevar es que al hacer sus módulos clases abstractas en lugar de objetos (o clásicos , módulos globales estáticas como en 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{}
}
puede instanciar múltiples subclases e instancias de un módulo con diferentes características concretas. Esto le permite configurar el módulo de manera diferente dependiendo de las circunstancias (por ejemplo, sustituyendo el componente de la base de datos durante la prueba o el componente IO cuando se encuentra en un entorno de desarrollo) e instalando múltiples módulos, cada uno con su propio conjunto de estados modificados con ámbito de módulo.
Por lo que puedo entender, en un nivel básico, el único requisito importante es que pueda tener clases anidadas, de modo que la clase adjunta pueda actuar como un módulo.
Otro requisito práctico es que puede distribuir la definición de clase en varios archivos, ya que un módulo con un montón de clases probablemente contenga más líneas de código de las que la mayoría aceptaría en un único archivo fuente.
Scala hace esto con los rasgos, que traen algunos otros objetos que son agradables pero no centrales para todo el propagar abstract-module-class sobre varios archivos fuente idea. C# tiene partial classes
, que proporciona la misma funcionalidad y también permite clases anidadas. Presumiblemente algunos otros lenguajes tienen soporte similar para clases anidadas, así como también para dividir una clase en múltiples archivos.
¿Este tipo de patrón se produce en cualquier lugar en C# o en otros idiomas? Creo que los grandes proyectos en muchos idiomas enfrentan el problema de que módulos abstractos están destinados a resolver. ¿Hay alguna razón para que esta cosa de "clase abstracta como módulo abstracto" no funcione y, por lo tanto, no se use? Me parece una solución mucho más limpia que los diversos marcos DI con el tipo de oferta de la misma funcionalidad.
Creo que estás de suerte, y la razón es un malentendido: ** las clases parciales no tienen nada que ver con los rasgos **. Las clases parciales son simplemente una forma de propagar una definición de clase en varios archivos, mientras que los rasgos son un mecanismo poderoso (y no existente en C#) del sistema de tipos./EDITAR O tal vez no, si solo necesitas el mecanismo proporcionado por clases parciales. –
Mi punto es que aunque los rasgos te permiten hacer todo tipo de cosas agradables con tus módulos abstractos, el núcleo del elemento 'clase-como-abstracto-módulo' solo requiere la capacidad de jerarquizar clases y extenderlas en múltiples archivos. Podría estar completamente equivocado en esto, así que por favor corrígeme si lo hago. –