クラスは実装をオーバーライドするサブクラスを持つことができますが、オブジェクトはサブクラス化できません。クラスは、オブジェクトができないパラメトリック型にすることもできます。
オブジェクトのインスタンスは常に 1 つだけ、またはコンテナーごとに少なくとも 1 つのインスタンスがあります。クラスには複数のインスタンスがあります。これは、クラスを値でパラメータ化できることを意味します
class A(param1 : int, param2 : int) {
def algorithmImplementation(arg : List[String]) = // use arg and params
}
そして、それは次のように再利用できます
val A42_13 = new A(42, 13)
val result1 = A42_13.algorithmImplementation(List("hello", "world"))
val result2 = A42_13.algorithmImplementation(List("goodbye", "cruel", "world"))
Djikstra のアルゴリズムの例に関連してこのすべてを理解するために、複数のノード タイプで再利用可能なアルゴリズムの 1 つの実装を記述したいとします。次に、ノード タイプ、距離の測定に使用されるメトリックのタイプ、および距離の計算に使用される関数によってパラメータ化することができます。
val Djikstra[Node, Metric <: Comparable[Metric]](distance : (Node, Node) => Metric) {
def compute(node : Node, nodes : Seq[Node]) : Seq[Metric] = {...}
}
プログラムで使用するノード/メトリック/距離関数の異なるタイプごとに Djikstra のインスタンスを 1 つ作成し、そのインスタンスを再利用します。Djikstra を計算するたびにすべての情報を渡す必要はありません。
要約すると、クラスはより柔軟です。柔軟性が必要な場合に使用してください。それ以外のオブジェクトは問題ありません。