2010-04-02 58 views
6

考慮我的第一次嘗試,像下面這樣的簡單類型在F#:如何在F#中正確實現一個屬性?

type Test() = 
    inherit BaseImplementingNotifyPropertyChangedViaOnPropertyChanged() 
    let mutable prop: string = null 
    member this.Prop 
     with public get() = prop 
     and public set value = 
      match value with 
       | _ when value = prop ->() 
       | _ -> 
        let prop = value 
        this.OnPropertyChanged("Prop") 

現在我通過C#測試此(此對象被暴露於C#項目,所以表觀C#語義是期望的):

[TestMethod] 
public void TaskMaster_Test() 
{ 
    var target = new FTest(); 
    string propName = null; 
    target.PropertyChanged += (s, a) => propName = a.PropertyName; 
    target.Prop = "newString"; 

    Assert.AreEqual("Prop", propName); 
    Assert.AreEqual("newString", target.Prop); 

    return; 
} 

propName已正確分配,我的F#Setter正在運行,但第二個斷言失敗,因爲基礎值prop沒有更改。這種情況對我來說很有意義,因爲如果我從prop字段中刪除mutable,則不會生成錯誤(並且應該是因爲我試圖修改該值)。我想我必須錯過一個基本概念。

Test類中重新綁定/變異prop的正確方法是什麼,以便我可以通過我的單元測試?

回答

8

試試這個:

type Test() = 
    inherit BaseImplementingNotifyPropertyChangedViaOnPropertyChanged() 
    let mutable prop: string = null 
    member this.Prop 
     with public get() = prop 
     and public set value = 
      match value with 
       | _ when value = prop ->() 
       | _ -> 
        prop <- value 
        this.OnPropertyChanged("Prop") 

你需要做結合可變的,然後改變其在二傳手的價值。在你最初的代碼中,你只是在你的setter中創建一個新的綁定(也叫prop),所以沒有任何變化可見。

+0

謝謝,@kvb。沒有什麼讓我覺得自己像一個簡單的解決方案,在語言上像一個n00b。 :) – 2010-04-02 15:00:59

+0

@Greg - 沒問題。綁定和隱藏工作的方式可能需要一些習慣,特別是因爲其他語言做得如此不同。但是,一旦你的思維模式變得直白,我認爲F#方法的優雅就會變得明顯。 – kvb 2010-04-02 15:06:28

5

在你的模式匹配你實際上是結合了新的價值與

let prop = value 

當您綁定的同名像這樣的值,它會屏蔽其他的價值,爲新聲明的一個範圍。我相信你真正想要做的是這樣的:

prop <- value 
9

作爲一個側面說明,我可能會使用if .. then代替match結構,因爲它使代碼更簡潔(patterh匹配是特別有價值的,當你需要以再次測試多個複雜模式的值)。此外,publicmember默認訪問,這樣可以使代碼有點更簡潔:

type Test() = 
    inherit BaseImplementingNotifyPropertyChangedViaOnPropertyChanged() 
    let mutable prop : string = null 
    member this.Prop 
     with get() = prop 
     and set(value) = 
      if value <> prop then 
       prop <- value 
       this.OnPropertyChanged("Prop") 
+1

我完全已經買了你的書。 :)有用的閱讀,但我希望當我問這個問題時,我會保持它的方便! – 2010-04-06 13:53:49