2010-09-10 17 views
5

consideri l'interfaccia:Tipo di proprietà Item in F #

type IVector = 
    abstract Item : int -> float 

Ora, cerchiamo di definire la classe:

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

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

Che dire di fornitura di un metodo di mutare l'ingresso n-esimo del vettore denso? Quindi, sarebbe bello per modificare il codice di cui sopra come:

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 

Tuttavia, ho il seguente errore a causa della firma del metodo astratto Item nell'interfaccia IVector:

No proprietà astratta è stato trovato che corrisponde a questo override.

Allora, che cosa dovrebbe essere la firma del Item in IVector?

risposta

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

eccellente. Grazie mille! – Allan

+1

strano, la definizione del setter nell'interfaccia non è necessaria in C# ... –

+0

@Mauricio, sì lo è. Cioè, è se vuoi chiamare il setter tramite l'interfaccia. E se non lo fai, e hai solo il getter nell'interfaccia, quindi è ancora illegale decommentare il setter qui: "public class V: IV {double IV.this [int x] {get {return 0.0;}/* set {} * /}} "(ricorda che tutte le interfacce in F # sono esplicite). – Brian

3

È possibile implementare DenseVector senza cambiare l'interfaccia originale, fornendo inoltre un setter come questo:

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