Scala中的构造函数

时间:2013-10-15 17:04:46

标签: java scala functional-programming

我在Scala中遇到了一些与辅助构造函数有关的设计问题,这些辅助构造函数必须立即调用主要(或其他辅助)

我认为以下示例演示了概念

class Matrix(args: AbstractRowColumn*) { ... }

class Column(elem: Double*) extends AbstractRowColumn { ... }

class Row(elem: Double*) extends AbstractRowColumn { ... }

在这里,我认为Matrix应该由行或列构建。但是,这会导致问题,因为每个都需要一组不同的逻辑,首先必须在调用构造函数之前完成。 (e.i Column必须在创建最终Matrix之前以与Row不同的顺序处理它的元素)

我如何解决这个问题?更好的设计?

2 个答案:

答案 0 :(得分:3)

Scala的主要构造函数的重点在于每个类应该具有单个一致的内部表示,将行为附加到指定为类参数的(理想上不可变的)数据集。

考虑将Matrix抽象为一些基本操作,然后进行两次实现:

abstract class Matrix {
  def get(r: Int, c: Int): Double
  def numRows: Int
  def numCols: Int
}

case class RowMatrix(rows: Array[Row]) extends Matrix {
  def get(r: Int, c: Int): Double = rows(r)(c)
  def numRows: Int = rows.length
  def numCols: Int = rows(0).length
}

case class ColumnMatrix(cols: Array[Column]) extends Matrix {
  def get(r: Int, c: Int): Double = cols(c)(r)
  def numRows: Int = cols(0).length
  def numCols: Int = cols.length
}

答案 1 :(得分:1)

  

每个都需要一组不同的逻辑,首先必须先完成   调用构造函数。

听起来你需要某种时尚的builder,例如

val matrix = MatrixBuilder.withRows(....).build