2009-07-31 13 views
5

Existe esta dicotomía en la forma en que podemos crear clases en f # que realmente me molesta. Puedo crear clases utilizando un formato implícito o uno explícito. Pero algunas de las características que deseo solo están disponibles para su uso con el formato implícito y algunas solo están disponibles para su uso con el formato explícito.Con respecto a la programación orientada a objetos F #

Por ejemplo:

  1. no puedo usar let inline * (o let solo) dentro de una clase definida de forma explícita.

  2. La única manera (que yo sepa) para definir inmutables públicas campos (*) no propiedades dentro de una clase definida implícitamente es la sintaxis val bla : bla.

    Pero hay una redundancia aquí. Dado que terminaré con dos copias de los mismos datos inmutables, uno privado, uno público (porque en el modo implícito los parámetros del constructor persisten durante toda la existencia de la clase)

  3. (No es tan relevante) La necesidad de usar atributos para la sobrecarga de métodos y para los valores predeterminados del campo es bastante desalentador.

¿Hay alguna manera de solucionar este problema?

* Por razones de rendimiento

EDIT: Resulta que estoy equivocado acerca de los dos puntos (Gracias Ganesh Sittampalam & MichaelGG).

  1. Aunque no puedo usar let inline tanto en & definición de clase explícita implícita, puedo usar member inline muy bien, que yo supongo que hace lo mismo.

  2. Al parecer, con el último F # ya no hay redundancia, ya que los parámetros no utilizados en el cuerpo de la clase son locales para el constructor.

  3. Will be gone en la siguiente versión de F #.

+0

"Por razones de rendimiento"? No puedo decir que me gusta el sonido de eso;) – Juliet

+0

Se trata principalmente de números crujidos relacionados con la programación de gráficos. Vea aquí: http://blogs.msdn.com/ricom/archive/2006/09/07/745085.aspx. –

+0

Su pregunta no da una pista del problema que está tratando de resolver. Supongo que quiere emular la Programación Orientada a Objetos del estilo C++ en F #. (¡Corrígeme si no lo eres!). Pero, ¿por qué necesita esto en un lenguaje funcional? Supongo que esto es particular del problema en el que está trabajando y podría ser interesante si realiza una publicación detallada al respecto aquí. –

Respuesta

5

Esto puede no ser útil, pero puede hacer que los miembros se alineen. "miembro en línea privado" funciona bien.

+0

Sí ayuda. Gracias. Significa que me conformaré con usar la sintaxis explícita. –

1

Para let inline, se puede trabajar en torno al moverlo fuera de la clase y explícitamente que pasa todos los valores que necesita desde dentro del ámbito de la clase cuando se llama a ella. Como estará en línea, no habrá penalización de rendimiento por hacer esto.

Cuestiones relacionadas