2010-09-10 27 views
5

Xem xét giao diện:Loại Item bất động sản trong F #

type IVector = 
    abstract Item : int -> float 

Bây giờ, chúng ta hãy xác định các lớp:

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

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

gì về cung cấp một phương pháp để biến những entry n-thứ của vector dày đặc? Sau đó, nó sẽ được tốt đẹp để thay đổi mã trên như:

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 

Tuy nhiên, tôi nhận được lỗi sau vì chữ ký của phương pháp trừu tượng Item trong giao diện IVector:

Không có tài sản trừu tượng đã được tìm thấy tương ứng với ghi đè này.

Vì vậy, chữ ký của Item trong IVector là gì?

Trả lời

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

Tuyệt vời. Cảm ơn bạn rất nhiều! – Allan

+1

lạ, xác định trình thiết lập trong giao diện là không cần thiết trong C# ... –

+0

@Mauricio, đúng vậy. Đó là, nếu bạn muốn gọi setter thông qua giao diện. Và nếu bạn không, và chỉ có getter trong giao diện, sau đó nó vẫn là bất hợp pháp để uncomment setter ở đây: "public class V: IV {double IV.this [int x] {get {return 0.0;}/* set {} * /}} "(nhớ lại rằng tất cả các giao diện trong F # là rõ ràng). – Brian

3

Bạn có thể thực hiện DenseVector mà không thay đổi giao diện ban đầu khi cũng cung cấp một setter như thế này:

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 
Các vấn đề liên quan