2

Scala でa を表現したいとBookします。これは XML から直接生成されます。XMLObjectXML との間で直接マッピングできるクラスをラップする親クラスに含める必要があります。

以下はこれの実用的な実装の例ですが、コンストラクターを抽象化できず、overrideキーワードを使用できない理由を知りたいのですが、サブクラスの親と同じシグネチャでコンストラクターを再定義して、期待どおりに機能します。

これは「悪い」コーディング プラクティスと見なされますか? もしそうなら、同様の機能を実現するためのより良い方法は何でしょうか?

abstract class XMLObject {
  def toXML:Node
  def this(xml:Node) = this()
}

class Book(

  val author:String = "",
  val title:String = "",
  val genre:String = "",
  val price:Double = 0,
  val publishDate:Date = null,
  val description:String = "",
  val id:Int = 0

  ) extends XMLObject {

  override def toXML:Node =
    <book id="{id}">
      ...
    </book>

  def this(xml:Node) = {
    this(
      author = (xml \ "author").text,
      title = (xml \ "title").text,
      genre = (xml \ "genre").text,
      price = (xml \ "price").text.toDouble,
      publishDate = (new SimpleDateFormat("yyyy-MM-dd")).parse((xml \ "publish_date").text),
      description = (xml \ "description").text
    )
  }
}

使用例:

val book = new Book(someXMLNode)
4

2 に答える 2

1

コンストラクターは、次の形式でのみ呼び出すことができます。

new X(...)

これは、作成しようとしているオブジェクトのランタイム タイプを知っていることを意味します。ここでのオーバーライドの意味は意味がありません。たとえば、抽象クラスでコンストラクターを定義することもできますが、これは連鎖 (クラス コンストラクターでスーパークラス コンストラクターを呼び出す) のためです。

あなたが探しているように見えるのは、むしろ工場のパターンです:

  1. からコンストラクターを削除しますXMLObject
  2. XMLObject必要に応じて、渡す XML に基づいてどのサブクラスを作成するかを決定する関数を のコンパニオンに追加します。

例えば:

object XMLObject {
  def apply(xml: Node) = xml match {
    case <book> _ </book> => new Book(xml)
    // ...
    case _ => sys.error("malformed element")
  }
}
于 2013-06-12T18:42:31.183 に答える
1

これには型クラスを使用します。

Book (およびその他のもの) を XML との間でマッピングできるようにしたいという事実は、それらのエンティティーとは直交しています。これらのオブジェクトに共通の XML マッピング機能を持たせたいという事実だけに基づいて、クラス階層を選択することは望ましくありません。Book の適切なスーパークラスは、PublishedEntity などですが、XMLObject ではありません。

来週、JSON の解析/レンダリングを追加したい場合はどうなりますか? XML のスーパークラスは既に使用しています。あなたならどうしますか?

より良い解決策は、XML インターフェイスの特性を作成し、それをルートに混在させることです。そうすれば、必要なだけ多くのものを混在させることができ、それでも賢明なクラス階層を自由に選択できます。

しかし、より良い解決策は型クラスです。メソッドを追加できない他の誰かのクラスのサポートを追加できるからです。

これはErik Osheim が型クラスについて準備したスライド プレゼンテーションです

多くの JSON パーサー/フォーマッター パッケージ (Spray など) は型クラスを使用します。私は Scala で XML をあまり使用していませんが、XML の型クラスの実装もあると思います。クイック検索でこれが見つかりまし

于 2013-06-13T17:13:00.503 に答える