2009-11-06 11 views

Respuesta

2

¿Te gusta?

type MyType(x:int, s:string) = 
    public new() = MyType(42,"forty-two") 
    member this.X = x 
    member this.S = s 

let foo = new MyType(1,"one") 
let bar = new MyType() 
printfn "%d %s" foo.X foo.S  
printfn "%d %s" bar.X bar.S  

Esta es la forma típica de hacerlo. Haga que el constructor "más parametrizable" sea el constructor implícito, y el resto sean sobrecargas "nuevas" definidas como miembros en la clase que llama al constructor implícito.

EDITAR

Hay un error en la Beta 2 en relación con las clases abstractas. En algunas circunstancias se puede evitar usando los argumentos por defecto en el constructor implícita, a la

[<AbstractClass>] 
type MyType(?cx:int, ?cs:string) = 
    let x = defaultArg cx 42 
    let s = defaultArg cs "forty-two" 
    member this.X = x 
    member this.S = s 
    abstract member Foo : int -> int 

type YourType(x,s) = 
    inherit MyType(x,s)  
    override this.Foo z = z + 1 

type TheirType() = 
    inherit MyType()  
    override this.Foo z = z + 1 

let foo = new YourType(1,"one") 
let bar = new TheirType() 
printfn "%d %s" foo.X foo.S  
printfn "%d %s" bar.X bar.S  
+0

sí, pero tiene que ser un tipo abstracto – Enes

+0

Wow, tienes razón, conviértalo en una clase abstracta y no funciona. Eso es un error; Lo he archivado. ¡Gracias por hacer la pregunta! – Brian

+0

genial ... bueno, realmente no, pero gracias por la respuesta de todos modos. Mientras tanto, ¿hay una solución para lograr esto? Quiero decir, aparte de hacer que la clase no sea abstracta. – Enes

Cuestiones relacionadas