2009-11-06 5 views

Antwort

2

Gefällt mir?

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  

Dies ist der typische Weg, es zu tun. Der Konstruktor "most parameters" ist der implizite Konstruktor und der Rest sind "new" Überladungen, die als Member in der Klasse definiert sind, die den impliziten Konstruktor aufrufen.

EDIT

ein Fehler in Beta2 in Bezug auf abstrakte Klassen Es gibt. Verwendung von Standardargumente auf dem impliziten Konstruktor 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

ja, aber es hat eine abstrakte Art – Enes

+0

Wow sein, du hast recht, mach es zu einer abstrakten Klasse und es funktioniert nicht. Das ist ein Fehler. Ich habe es abgelegt. Danke, dass du die Frage gestellt hast! – Brian

+0

toll .... naja nicht wirklich aber danke für die Antwort trotzdem. Gibt es in der Zwischenzeit einen Workaround, um das zu erreichen? Ich meine andere als die Klasse nicht abstrakt zu machen. – Enes

Verwandte Themen