Scala基于trait继承创建动态工厂



我有几个类扩展了一个trait。我创建了一个工厂方法,它使用模式匹配来实例化相关的类。

问题是,每当我创建一个扩展这个trait的新类时,我都需要手动将它添加到工厂方法中。是否有从所有可用类动态创建类列表的选项?

感谢

一些代码示例:

当前实现:

object Test {
  trait Parent
  object Parent{
    def apply(classType:String): Parent = classType match {
      case "A" => new A
      case "B" => new B
      case "C" => new C
    }
  }
  class A extends Parent
  class B extends Parent
  class C extends Parent
}

想要的行为:

object Test {
  trait Parent
  object Parent{
    def apply(classType:String): Parent = SomeFunction(ClassType)
    }
  }
  class A extends Parent
  class B extends Parent
  class C extends Parent
}

使用反射获取扩展此trait的所有类

获取相关类并将其添加到列表中。

或者您可以创建一个Map,它可以通过一些key来帮助定位类

package demo

trait Animal {
}
class Dog extends Animal
class Cat extends Animal

库使用org.clapper" %% "classutil" % "1.0.11"

import org.clapper.classutil.{ClassFinder, ClassInfo}
object Main {
  def main(args: Array[String]): Unit = {
    val finder  = ClassFinder()
    val classes = ClassFinder.classInfoMap(finder.getClasses().iterator)
    val impl    = find("demo.Animal", classes)
    impl.foreach(println)
  }
  def find(ancestor: String, classes: Map[String, ClassInfo]): List[ClassInfo] =
    classes.get(ancestor).fold(List.empty[ClassInfo]) { ancestorInfo =>
      val ancestorName = ancestorInfo.name
      def compare(info: ClassInfo): Boolean =
        info.name == ancestorName ||
          (info.superClassName :: info.interfaces).exists {
            n => classes.get(n).exists(compare)
          }
      val it = classes.valuesIterator
      it.filter { info => info.isConcrete && compare(info) } .toList
    }
}

demo.Dog
demo.Cat

请注意,大部分代码都是从这篇文章中摘取的,并为了满足当前的目的而进行了修改。

相关内容

  • 没有找到相关文章

最新更新