Tip

2010-09-10 35 views
5

arayüzü düşünün: ŞimdiTip

type IVector = 
    abstract Item : int -> float 

bize sınıfını tanımlayalım:

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

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

n-inci girişi mutasyona arz konusunda ne bir yöntemdir yoğun vektör

yok soyut özelliği:

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 

Ancak, ben çünkü IVector arayüzünde soyut yöntemin Item imza aşağıdaki hatayı alıyorum: Sonra, yukarıdaki kodunu değiştirmek iyi olurdu Bu geçersiz kılma karşılık gelen bulundu.

IVector'da Item imzası ne olmalıdır?

cevap

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

. Çok teşekkür ederim! – Allan

+1

garip, arayüzdeki ayarlayıcıyı tanımlamak C# ... –

+0

@Mauricio'da gerekli değildir, evet öyle. Yani, setter'i arayüz üzerinden aramak isteyebilirsiniz. Ve eğer almazsanız ve sadece arayüzde alıcı varsa, o zaman buradaki ayarlayıcıyı rahatsız etmek hala yasa dışıdır: "kamu sınıfı V: IV {çift IV.this [int x] {get {dönüş 0.0;}/* {} * /}} "ayarını yapın (F # deki tüm arabirimlerin açık olduğunu hatırlayın). – Brian

3

Ayrıca böyle bir ayarlayıcı sağlarken orijinal arayüz değiştirmeden DenseVector uygulayabilirsiniz: Mükemmel

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