2010-09-10 6 views
5

Betrachten Sie die Schnittstelle:Art des Item-Eigenschaft in F #

type IVector = 
    abstract Item : int -> float 

Nun wollen wir uns die Klasse definieren:

type DenseVector(size : int) = 
    let mutable data = Array.zeroCreate size 

    interface IVector with 
     member this.Item with get n = data.[n] 

Was eine Methode, um über Versorgung mutieren die n-te Eintrag der dichter Vektor? Dann wäre es schön, den obigen Code zu modifizieren, wie:

type DenseVector(size : int) = 
    let mutable data = Array.zeroCreate size 

    interface IVector with 
     member this.Item with get n = data.[n] 
          and set n value = data.[n] <- value 

Allerdings habe ich die folgende Fehlermeldung wegen der Unterzeichnung des abstrakten Methode Item in der IVector Schnittstelle:

Keine Zusammenfassung Eigentum wurde gefunden, das dieser Übersteuerung entspricht.

Also, was sollte die Unterschrift von Item in IVector sein?

Antwort

8
type IVector = 
    abstract Item : int -> float with get, set 
+0

Excellent. Ich danke dir sehr! – Allan

+1

seltsam, Definieren der Setter in der Schnittstelle ist nicht notwendig in C# ... –

+0

@Mauricio, ja, es ist. Das heißt, wenn Sie den Setter über die Schnittstelle aufrufen möchten. Und wenn Sie das nicht tun und nur den Getter im Interface haben, ist es immer noch illegal, den Setter hier auskommentieren zu lassen: "public class V: IV {double IV.this [int x] {get {return 0.0;}/* Setzen Sie {} * /}} "(erinnern Sie sich, dass alle Schnittstellen in F # explizit sind). – Brian

3

Sie können DenseVector implementieren, ohne die ursprüngliche Schnittstelle zu ändern, während auch eine Setter wie folgt bereitstellt:

type IVector = 
    abstract Item: int -> float with get 

type DenseVector(size : int) = 
    let data = Array.zeroCreate size 
    interface IVector with 
     member this.Item with get i = data.[i] 
    member this.Item 
     with get i = (this :> IVector).[i] 
     and set i value = data.[i] <- value