2010-09-10 21 views
5

Considere la interfaz:tipo de la propiedad de artículos en Fa #

type IVector = 
    abstract Item : int -> float 

Ahora, definamos la clase:

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

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

¿Qué hay de suministro de un método para mutar la entrada de orden n de la vector denso? Entonces, sería bueno que modificar el código anterior como:

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 

Sin embargo, me sale el siguiente error debido a la firma del método abstracto Item en la interfaz IVector:

Sin propiedad abstracta se encontró que corresponde a esta anulación.

Entonces, ¿cuál debería ser la firma de Item en IVector?

Respuesta

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

excelente. Muchas gracias! – Allan

+1

raro, definir el colocador en la interfaz no es necesario en C# ... –

+0

@Mauricio, sí lo es. Es decir, lo es si desea llamar al setter a través de la interfaz. Y si no lo haces, y solo tienes el getter en la interfaz, entonces sigue siendo ilegal descomentar al setter aquí: "public class V: IV {double IV.this [int x] {get {return 0.0;}/* set {} * /}} "(recuerde que todas las interfaces en F # son explícitas). – Brian

3

Puede implementar DenseVector sin cambiar la interfaz original mientras que también proporciona un regulador de la siguiente manera:

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 
Cuestiones relacionadas