我有几个扩展特性的类。 我创建了一个工厂方法,它使用模式匹配来实例化相关的类。
问题是每当我创建一个扩展这个特性的新类时,我需要手动将它添加到工厂方法中。 有没有从所有可用类动态创建类列表的选项?
由于
一些代码示例:
目前的实施:
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
}
答案 0 :(得分:3)
使用反射获取扩展此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
请注意,大部分代码都来自此帖子并更改为套件当前目的Get all the classes that implments a trait in Scala using reflection