0

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

我认为下面的例子演示了这个概念

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

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

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

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

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

4

2 回答 2

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
}
于 2013-10-15T18:20:56.613 回答
1

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

听起来你需要一些时尚的建设者,例如

val matrix = MatrixBuilder.withRows(....).build
于 2013-10-15T17:09:10.130 回答