Pregunta

No puedo encontrar la sintaxis adecuada para codificar un tipo D que herede una clase base B (escrita en C #) y sus constructores que no sean el constructor implícito de la clase base:

código C #:

public class B
{
    private int _i;
    private float _f;
    public B()
    {
        _i = 0;
        _f = 0.0f;
    }
    public B(int i)
    {
        _i = 0;
        _f = 0.0f;
    }
    public B(int i, float f)
    {
        _i = i;
        _f = f;
    }
}

código F #:

type D() =
    inherit B()
    //how to inherit from other constructors ?

Gracias

¿Fue útil?

Solución

Encontré una manera de hacerlo gracias a esto blog !

type D =
    class
        inherit B

        new () = {
            inherit B()
        }
        new (i : int) = {
            inherit B(i)
        }
        new ((i,f) : int*single) = {
            inherit B(i, f)
        }
    end

Sí, es un poco engorroso, pero como Brian dijo que no es la mayoría de los casos.

EDITAR: En realidad, las palabras clave de clase / final no son obligatorias para eso (así que retomo lo que dije sobre la incomodidad). Como dijo Brian en su blog aquí , F # normalmente infiere el tipo de tipo que se define, lo que hace que estos tokens sean innecesarios / redundantes.

type D =
    inherit B

    new () = {
        inherit B()
    }
    new (i : int) = {
        inherit B(i)
    }
    new ((i,f) : int*single) = {
        inherit B(i, f)
    }

Otros consejos

De los documentos: " Los argumentos para el constructor de la clase base aparecen en la lista de argumentos en la cláusula de herencia. " Por ejemplo:

type D(i: int) =
   inherit B(i)

No estoy seguro si puede llamar a diferentes constructores de clase base de diferentes constructores de F #, porque F # requiere que todos los constructores pasen por el " primario " constructor (debido a que los argumentos del constructor primario están en el alcance de toda la clase, por lo que deben inicializarse). En su caso, puede salirse con la suya porque su clase base tiene un constructor máximo:

type D(i : int, f : float) =
  inherit B(i, f)
  new(i : int) = D(i, 0.0)
  new() = D(0, 0.0)

Pero para una clase base sin un constructor máximo, no estoy seguro de que esto sea posible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top