2009-10-25 7 views
4

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

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

F code #:

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

Merci

Répondre

6

J'ai trouvé un moyen de le faire grâce à cette blog! 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 l'encombrement). Comme Brian l'a dit sur son blog here, F # déduit normalement le type de type 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) 
    } 
5

de la documentation: « les arguments en faveur de la b ase class constructor apparaît 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 de différents constructeurs F #, parce que F # exige que tous les constructeurs de passer par le constructeur « primaire » (parce que les principaux arguments du constructeur sont en place pour toute la classe, donc ils doivent être initialisés). Dans votre cas, vous pouvez vous en sortir avec elle parce que 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 un constructeur maximal Je ne suis pas sûr que ce soit possible.

+0

Mais qu'en est-il de l'héritage de plusieurs constructeurs? – Stringer

+0

J'ai mis à jour la réponse pour en discuter (même si j'ai de nouveau rencontré les limites de mes propres connaissances ici, alors j'espère que quelqu'un d'autre interviendra si je me trompe ...). – itowlson

+2

Il est possible que différents constructeurs de classes dérivées appellent des constructeurs de base différents, mais uniquement lors du passage à la syntaxe de classe «explicite». Je vais essayer d'en poster un exemple plus tard. En tout cas, c'est une bonne réponse qui couvre le cas de 97%. – Brian