2

私はScalaが初めてです。クラスにメソッドを実装するにはどうすればよいですか?

次のような特性を定義しました。

trait Node extends Component{
  val label:Int
  val inputEdges:List[Edge] = List[Edge]()
  val outputEdges:List[Edge] = List[Edge]()

  def addInputEdge(edge:Edge) = {
    inputEdges :+ edge
    this
  }

  def addOutputEdge(edge:Edge) = {
    outputEdges :+ edge
    this
  }
}

case class SomeNode(label:Int) extends Node

2 つの方法を実装する方法を理解するために助けが必要です。

Node を拡張するすべてのクラスは、コンストラクターでラベルを提供する必要がありますが、2 つのメソッドと 2 つのリストを継承する必要があります。また、メソッドは、エッジがリストの 1 つに追加されたノードの新しいオブジェクトを返す必要があります。現在、メソッドの 1 つを呼び出すと、リストの 1 つにエッジが追加されていない同じオブジェクトが取得されます。理にかなっていますが、2 つのリストが不変の場合にエッジを追加する方法がわかりません。

多くのパラメーターを持つコンストラクターを取得するため、コンストラクターでリストを渡したくありません。

4

3 に答える 3

0

求めていることを達成する方法はいくつかあります。var最初に、inputEdges と outputEdges をs ではなくsとして単純に定義できますval。そうすれば、addInputEdge および addOutputEdge メソッドで作成したリストを対応するフィールドに再割り当てできます。

trait Node extends Component {
  val label:Int
  var inputEdges:List[Edge] = List[Edge]()
  var outputEdges:List[Edge] = List[Edge]()

  def addInputEdge(edge:Edge) = {
    inputEdges = inputEdges :+ edge
    this
  }

  def addOutputEdge(edge:Edge) = {
    outputEdges = outputEdges :+ edge
    this
  }
}

ただし、これにより、望ましくない可能性のある可変状態が導入されます。同様の代替アプローチは、MutableListなどの可変リストを使用することです。さらに別のアプローチは、 add メソッドを抽象化し、指定されたエッジを追加して自分自身の新しいインスタンスを作成するサブクラスを持たせることです。

于 2013-05-15T17:24:49.133 に答える