2011-08-08 25 views
1

我有一個父類和幾個子類。我想要的是當在子類的實例上調用特定的setter方法時,父類中「同步」的布爾值被設置爲false。應該可以創建同步或非同步狀態的子類。我在做什麼錯? (有了Scala的超類參數)

這是我想出了:現在

class A(protected var isSync: Boolean) { 
} 
class B(var value:String, isSync: Boolean) extends A(isSync) { 
    override def value_=(value:String): Unit = { 
    this.isSync = false 
    this.value = value 
    } 
} 

,這並不編譯了一些理由:value分配給this.value是模糊的; var註釋已經定義了value_=;和this.isSync引用本地構造函數字段isSync,而不是(可寫)父字段。 Stack Overflow上

This提問時指出,我應該使用__value(不是value或任何名稱)作爲構造一個private var,並定義二傳手自己。一些修修補補後,我想出了下面的代碼可以編譯和作品:

class A(protected var isSync: Boolean) { 
} 
class B(private var __value: String, private val __isSync: Boolean) 
    extends A(__isSync) { 
    def value = __value 
    def value_=(value: String) = { 
    this.isSync = false 
    this.__value = value 
    } 
} 

然而,這個代碼感覺很餿的是現在我懷疑我在做一個(如果不是更多)根本錯誤。任何人都可以請糾正我?

因此具體的問題是:

  1. 是否存在(如果,這)在我想要實現的根本缺陷?對於某些情況:對象在更改時可以(並且可能必須)與服務器同步。
  2. 將參數傳遞給您擴展的類的正確/最佳方法是什麼?
  3. 覆蓋由var(或通常提供您自己的setter實現)生成的setter的權利/最佳方式是什麼?

回答

3

關於問題1:我猜想你想跟蹤自上次被複制到服務器後對象是否發生了變化,是嗎?這很明智,只要服務器上的副本不能被修改:否則確保副本的一致性更加複雜(副本一致性是關鍵詞搜索,但我不會推薦它)。 爲了清楚起見,我會談論乾淨或骯髒 - 同步提醒我太密切關於​​Java語句。

關於問題2,您不需要製作__isSync a private val(將存儲在類中),您可以將其保留爲構造函數參數。只要它沒有被使用(除了調用A的構造函數之外),__isSync不應該在B的實例中佔用額外的空間。我刪除了private val註釋,獲得了按預期正確編譯的代碼。

class A(protected var isSync: Boolean) { 
} 
class B(private var __value: String, __isSync: Boolean) 
    extends A(__isSync) { 
    def value = __value 
    def value_=(value: String) = { 
    this.isSync = false 
    this.__value = value 
    } 
} 

關於美學和問題3:我會避免雙下劃線。來自Scala編程(第18.2節)的類似示例只是使用較短的名稱。他們還使用private[this]來阻止從同一類的其他實例訪問該成員。最後,您可以在類decl後刪除{}。在這個例子中(即使可能不在你的代碼中)。

因此,我們會得到這樣的代碼,這是接近我已經提到的例子:

class A(protected var isSync: Boolean) 
class B(private[this] var v: String, sync: Boolean) 
    extends A(sync) { 
    def value = v 
    def value_=(value: String) = { 
    isSync = false 
    v = value 
    } 
} 
+1

謝謝!太糟糕了Scala並不簡單地允許'class X(var v:String){override def v _ =(arg:String)= ...}'! :( – wen