Question

Je ne trouve pas la syntaxe appropriée pour coder un type D qui hérite d'une classe de base B (écrite en C #) et de ses constructeurs autres que le constructeur implicite de la classe de base:

Code 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;
    }
}

code F #:

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

Merci

Était-ce utile?

La solution

J'ai trouvé un moyen de le faire grâce à cette 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

Oui, c'est un peu lourd, mais comme Brian l'a dit, ce n'est pas la majorité des cas.

EDIT: En fait, les mots clés de classe / fin ne sont pas obligatoires pour cela (donc, je reprends ce que j'ai dit à propos de la lourdeur). Comme le disait Brian sur son blog, ici, le F # en déduit normalement le type de type étant défini, rendant ces jetons inutiles / redondants.

type D =
    inherit B

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

Autres conseils

Dans la documentation: "Les arguments du constructeur de la classe de base apparaissent dans la liste des arguments de la clause inherit." Par exemple:

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

Je ne sais pas si vous pouvez appeler différents constructeurs de classe de base à partir de différents constructeurs F #, car F # oblige tous les constructeurs à passer par le paramètre "primaire". constructeur (parce que les arguments du constructeur primaire sont dans la portée de la classe entière, ils doivent donc être initialisés). Dans votre cas, vous pouvez vous en tirer, car votre classe de base a un constructeur maximal:

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

Mais pour une classe de base sans constructeur maximal, je ne suis pas sûr que ce soit possible.

scroll top