¿Existe alguna forma mejor de modelar datos en F # para evitar necesitarlos?¿Por qué no hay un modificador de acceso protegido en F #?
Respuesta
El modificador protected
puede ser bastante problemático en F #, porque a menudo es necesario llamar a miembros desde una expresión lambda. Sin embargo, cuando haces eso, ya no tienes acceso al método desde dentro de la clase. Esto también causa confusión cuando se usan miembros protegidos declarados en C# (consulte, por ejemplo, this SO question). Si usted podría declarar un miembro de protected
, el siguiente código podría ser sorprendente:
type Base() =
protected member x.Test(a) = a > 10
type Inherited() =
inherit Base()
member x.Filter(list) =
list |> List.filter (fun a -> x.Test(a))
Este código no funcionaría, ya que está llamando Test
de una función lambda (que es un objeto diferente de la instancia actual de Test
), por lo que el código no funcionaría. Creo que esta es la razón principal para no apoyar el modificador protected
en F #.
En F # normalmente utiliza la herencia de implementación (es decir, hereda de una clase base) con mucha menos frecuencia que en C#, por lo que no debería necesitar protected
con tanta frecuencia. En cambio, generalmente se prefiere usar interfaces (en el código F # orientado a objetos) y funciones de orden superior (en el código funcional). Sin embargo, es difícil decir cómo evitar la necesidad de protected
en general (aparte de evitar la herencia de implementación). ¿Tiene algún ejemplo específico que motivó su pregunta?
En cuanto a si F # permite una mejor forma de modelado de datos, los archivos de firma permiten tomar decisiones de visibilidad más detalladas que internal
en C#, que a menudo es muy agradable. Vea el comentario de Brian here para una explicación un poco más. Esto es independiente de la compatibilidad (o la falta de ella) para protected
, sin embargo.
- 1. ¿Qué significa el modificador protegido?
- 2. ¿Cuándo utilizarías el modificador de acceso "protegido interno"?
- 3. ¿Hay alguna razón por la que no pueda definir el modificador de acceso en un método o en una interfaz?
- 4. ¿Por qué el modificador "protegido" en Java permite el acceso a otras clases en el mismo paquete?
- 5. ¿Por qué una función con modificador protegido puede ser anulada y accesible en todas partes?
- 6. ¿Por qué los idiomas de oop no tienen un modificador de acceso de "solo lectura"?
- 7. ¿Por qué no hay conversiones implícitas en F #?
- 8. ¿Hay un atajo de Eclipse para ordenar miembros por modificador?
- 9. C# acceso protegido campo
- 10. ¿Por qué los miembros de la interfaz no tienen ningún modificador de acceso?
- 11. Java: ¿Modificador de acceso más restrictivo que 'protegido', menos restrictivo que 'privado'?
- 12. método sin modificador de acceso
- 13. Modificador de acceso predeterminado en C#
- 14. ¿por qué no es posible robar un token de acceso?
- 15. por qué "f = f ++" no es seguro en c?
- 16. ¿Por qué está protegido CollectionView.CollectionChanged?
- 17. ¿Por qué no utilizar 'protegido' o 'privado' en PHP?
- 18. Java: acceso protegido en los paquetes
- 19. ¿Por qué F # no admite clases anidadas?
- 20. ¿Por qué el acceso de reflejo es miembro protegido/privado de clase en C#?
- 21. Diferencia entre especificador de acceso y modificador de acceso
- 22. Cómo aumentar el modificador de acceso de una propiedad
- 23. ¿Por qué preg_replace me arroja un error de "modificador desconocido"?
- 24. Heredando un método protegido por paquete por una clase en un paquete diferente
- 25. ¿Por qué no hay un String # shift()?
- 26. ¿Por qué no hay un documento.createHTMLNode()?
- 27. Modificador de acceso de subclases C++?
- 28. ¿Por qué no hay un método Convert.toFloat()?
- 29. ¿Qué hace el modificador "privado"?
- 30. ¿Por qué no hay Dictionary.TrimExcess()?
Esto es cierto, pero es un artefacto de implementación del compilador. No existe una razón fundamental para que un lenguaje .NET similar a F # no pueda generar una clase anidada para albergar el cierre y tener la semántica deseada. – kvb
Buena explicación. Es fácil olvidarse de los objetos que el compilador F # crea para admitir lambdas y otras construcciones funcionales. Estoy escribiendo un ORM que se usará frecuentemente desde C#. Utiliza algo de un modelo de proveedor. Hay una clase abstracta de Repository, que podría ser ampliada por SqlRepository, OracleRepository, etc. Quería un método protegido que cargue información de esquema para una tabla. ¿Alguna idea de una mejor manera de hacer esto? – Daniel
@kvb - Pensé lo mismo. ¿Hay alguna manera en que el compilador pueda verificar si se accede a un miembro protegido desde un lambda en una clase derivada? – Daniel