2011-08-08 12 views
1

私は親クラスといくつかの子クラスを持っています。私が望むのは、特定のセッターメソッドが子クラスのインスタンスで呼び出され、親クラスの "同期された"のブール値が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 
    } 
} 

、これはいくつかの理由でコンパイルされません。this.valuevalueの割り当ては曖昧です。 varアノテーションは既にvalue_=を定義しています。 this.isSyncは、(書き込み可能な)親フィールドの代わりにローカルコンストラクタフィールドisSyncを参照します。スタックオーバーフローの

This質問は、私は、コンストラクタでprivate varとして__valuevalueではないか、任意の名前)を使用し、セッターを自分で定義する必要があることを指摘しました。しかし、このコードは、今では私は(もっとない場合)基本的なミスを作ってるんだ疑うほど悪臭感じ

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によって生成されたセッターをオーバーライドする(または通常は独自のセッターの実装を提供する)正しい/最善の方法は何ですか?

答えて

3

質問1:前回サーバーからコピーされてからオブジェクトが変更されたかどうかを確認したいと思いますか?レプリカの一貫性を保証するのはもっと複雑です(レプリカ一貫性はグーグルのキーワードですが、私はそれをお勧めしません)。 わかりやすくするために、私はきれいであるか汚れているかについて話していますが、​​Javaステートメントがあまりにも緊密です。

質問2については、__isSyncprivate 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]を使用します。最後に、クラス宣言の後に{}を削除することができます。この例では(あなたのコードではないかもしれません)。

したがって、私たちは、私はすでに述べた例に近くなる、このようなコードを取得したい:

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

関連する問題