1

システム内の投稿を表すクラスがあります。投稿が質問、ドキュメント、画像などを表す場合。Postクラスが表すことができるオブジェクトには約7種類あります。私たちが持っている7種類のオブジェクトのそれぞれには、追加のオブジェクト固有の情報を格納するための独自のメタデータクラスがあります。

現在、私のPostクラスには7つのオプションの属性があり、そのうちの1つはオブジェクトのタイプに応じて入力されます。しかし、Postクラスではこれらの7つの属性のうち1つしか入力されないため、これらを任意の型の単一の属性に統合する方法はありますか?次に、match caseステートメントを使用して、実行時に正しいメタデータオブジェクトを生成できます。または、言語の強く型付けされた性質を考えると、Scalaではこれは不可能です。

コードは以下のとおりです。

    case class Post (
      id       : Long,
      typ      : String,
      name     : String,
      fileInfo : Option[FileInfo],
      imageInfo : Option[FileImageInfo],
      videoInfo : Option[FileVideoInfo],
      audioInfo : Option[FileAudioInfo],
      eventInfo: Option[EventInfo],
      lectureInfo: Option[LectureInfo],
      drawingInfo: Option[DrawingInfo]
    )


    object Post {

      val simple = {
        get[Long]("object_view.id") ~
        get[String]("object_view.type") ~
        get[String]("object_view.name") map {
          case id~typ~name =>
            Post(
                 id, 
                 typ, 
                 name, 
                 FileInfo.getById(id),
                 FileImageInfo.getById(id),
                 FileVideoInfo.getById(id),
                 FileAudioInfo.getById(id),
                 EventInfo.getFirst(id),
                 LectureInfo.getById(id),
                 DrawingInfo.getById(id)
          )
       }
    }
4

2 に答える 2

1

Post を抽象化し、異なるタイプの post ごとにサブクラスを実装してみませんか? 何かのようなもの:

  abstract class Post { val id:Long; val typ:String; val name:String; }
  case class FilePost(
      id       : Long,
      typ      : String,
      name     : String,
      fileInfo : Option[FileInfo
  );
  case class ImagePost(
      id       : Long,
      typ      : String,
      name     : String,
      imageInfo : FileImageInfo
  );
  ...

  def doSomething( post:Post ):Unit = post match {
      case fp:FilePost => ...
    }

どっ!- 以前の回答が同じことを言っているように見えます...

于 2012-12-18T19:23:10.847 に答える
0
class FileInfo(val name: String)
abstract trait CanGet[T] { val value: Option[T]; def get = value.get }
case class PostFileInfo(val id: Long, val typ: String, val name: String) extends 
  { val value = Some(new FileInfo(name)) } with CanGet[FileInfo]

...

(1L, "FileInfo", "FileName") match { 
  case (id, typ @ "FileInfo", name) => new PostFileInfo(1, typ, name)
}
于 2012-12-18T02:22:59.330 に答える