Scala コンストラクターで名前付き引数を使用し、後でコンストラクター インターフェイスを壊したり、コードを非常に醜くしたりすることなく、getter と setter をオーバーライドすることは可能ですか?
次のスカラ コードを見てください。
class Person( var FirstName: String, var LastName: String )
素敵できれい。これにより、次のように使用できる person という単純なクラスが作成されます。
val john = new Person( FirstName="John", LastName="Doe" )
john.FirstName = "Joe"
println( john.FirstName )
後で、FirstName セッターに検証を追加することにしました。そのため、新しいプライベート ローカル変数を作成し、ゲッター メソッドとセッター メソッドをオーバーライドします。
class Person( var _FirstName: String, var _LastName: String ) {
def FirstName = _FirstName
def FirstName_= (value:String) = _FirstName = value
}
まだある程度きれいですが、これを行うには、コンストラクターの引数名を変更する必要があり、外部インターフェイスが壊れます。
私が思いついたこの問題の最初の解決策は
class Person {
var _FirstName:String = null
var LastName:String = null
def FirstName = _FirstName
def FirstName_= (value:String) = _FirstName = value
def this( FirstName: String, LastName: String ){
this()
this._FirstName = FirstName
this.LastName = LastName
}
}
これはいくぶん醜くエレガントではなく、私が最初に scala を使用していた理由のほとんどを取り除いてしまいます。
これを行うより良い方法はありますか?
tl;drコードを醜くしたり、パブリックインターフェイスを変更したりせずに、デフォルトのコンストラクターで定義されたメンバーのゲッター/セッターをオーバーライドする方法は?