Naprasený příklad ve Scale:
package matrix {
class Matrix(array: Array[Array[Double]]) {
private val elements = array
def toArray(): Array[Array[Double]] = {
this.elements
}
def isSquareMatrix() : Boolean = {
val numRows = this.elements.length
for (subArray <- this.elements) {
if (subArray.length != numRows) return false
}
return true
}
}
class SquareMatrix(array : Array[Array[Double]]) extends Matrix(array) {
def trace() : Float = {
return 0; // dummy
}
}
}
import java.lang.RuntimeException
import matrix._
object MatrixApp extends App {
implicit def toSquareMatrix(m: Matrix) : SquareMatrix = {
if (!m.isSquareMatrix()) throw new RuntimeException("Not a square matrix!")
return new SquareMatrix(m.toArray())
}
val m = new Matrix(Array(Array(1.0, 2.0),Array(1.0, 2.0, 3.0)));
println(m.trace())
}
Implicitní ve Scale umožňuje volat metody třídy SquareMatrix ad hoc, což je lepší než drátem do oka, ale samozřejmě to znamená, že se bude znovu a znovu kontrolovat, zda na to má nárok.
Problém ale je, co s tím dál. Pro matematické problémy typu počítání s maticemi je OOP extrémně nevhodné. Matice není nic jiného než dvourozměrné pole čísel a jako taková nepotřebuje žádné metody, stačí sada funkcí, které pracují nad dvourozměrnými poli, jestli je matice čtvercová nebo ne, je jednoduchý test a stačí ho udělat jenom jednou a pak už výpočet prostě ví, že je ve větvi, kde se dá pracovat se čtvercovou maticí anebo není.
Suma sumárum, pokud to měl být příklad, byl dost nevhodný a pokud fakt autor potřebuje řešit matice, moje rada je se na celé OOP vykašlat. Nehledě na to, že knihoven pro práci s maticemi budou mraky.