2016-11-26 17 views
0

次のコードをどのように改善できますか?今Scalaでコンストラクタを継承するにはどうすればよいですか?

def += (bitSet: BitSet): this.type = { this.bitSet | bitSet; this } 

:私はキャストについてはサブクラスでキャストまたはオブジェクトスーパークラスとオブジェクトのサブクラス

class Superclass { 
    val bitSet = BitSet.empty 
    def += (bitSet:BitSet) = { this.bitSet | bitSet ; this } 
    def += (ints:Array[Int]) = { ints.foreach { bitSet += _ } ; this } 
    override def toString = bitSet.toString 
} 

object Superclass { 
    def apply(bitSet:BitSet) = new Superclass += bitSet 
    def apply(ints:Array[Int]) = new Superclass += ints 
} 

class Subclass extends Superclass { 
    override def += (bitSet:BitSet) = (super.+= (bitSet)).asInstanceOf[Subclass] 
    override def += (ints:Array[Int]) = (super.+= (ints)).asInstanceOf[Subclass] 
} 

object Subclass { 
    def apply(bitSet:BitSet) = new Subclass += bitSet 
    def apply(ints:Array[Int]) = new Subclass += ints 
} 

object SubclassTest extends App { 
    println(Subclass(Array(1,2,3))) 
} 
+0

(一緒にthis.type可能性を使用して)? – Pavel

+0

スーパークラスのシングルトン実装では、変換の兆候があるので、どこかのimplicitsを使うべきだと言います。 – Pavel

+0

FPと命令型を混在させようとしています。通常、変更可能なオブジェクトに対しては 'this'を返さず、' + = 'は' Superclass'で実装されたように動作します。変更可能なオブジェクトを連結すると誤解を招く可能性があります。 –

答えて

2

間の重複に熱心ではないよ、あなたはあなたのSuperclassメソッドが親クラスの型を返すことができます、あなたはそれらを上書きする必要はありません。+=

class Subclass extends Superclass 
    val subclass: Subclass = new Subclass += BitSet.empty 

返される値は、タイプSubclassです。

+=メソッドは何もしません。BitSet.|はビットセットを変更しません。ただコピーを返してすぐに破棄します。 もう1人はうまくいっていますが、本当に本当に良い理由がない限り(おそらくそうではないかもしれませんが)、周りに可変状態を保っているのは、一般的に悩まされています。

applyの複製については、あまり一般的に行うことはできません。あなただけ

new Subclass(bitSet) 
    new Superclass(bitSet) 

または を行うことができ、applyするのではなく、今

class Superclass(val bitSet: BitSet = BitSet.empty) { 
    ... 
    } 
    class Subclass(bitSet: BitSet = BitSet.empty) 
    extends Superclass(bitSet) 

:この特定のケースでは、私は完全にそれを取り除くためにお勧めします、とビットセットにコンストラクタのパラメータになるだろう新しいサブクラス()+ = ints 新しいサブパクラス()+ = ints

+0

Love this.type。私は{this.bitSet | = bitSet;この }。実際のところ、これは大きな単純化であり、コンストラクタはかなり高価です。私は多くのインスタンス化を避けるために+ =と - =を使います。 –

1

コンパニオンオブジェクトの重複部分を分解するために、テンプレートパターンにバリエーションを使用することができます。なぜ形質にスーパークラスを変更しない

trait Factory[T <: Superclass] { 
    protected def create: T 
    def apply(bitSet:BitSet): T = create += bitSet 
    def apply(ints:Array[Int]): T = create += ints 
} 

object Superclass extends Factory[Superclass] { 
    protected def create = new Superclass 
} 

object Subclass extends Factory[Subclass] { 
    protected def create = new Subclass 
} 
関連する問題