【发布时间】:2022-01-15 05:16:39
【问题描述】:
所以我有一个抽象类和一堆扩展它的对象:
abstract class Command(val str: String, val help: String):
def apply(args: Seq[String]): String
object Command:
var all: Seq[Command] = Seq(Help, Quit, Play, Def)
def apply(args: Seq[String]): String =
//Do some stuff
object Help extends Command("?", "print help"):
def apply(args: Seq[String]): String =
//Do some stuff
object Quit extends Command(":q", "quit this app"):
def apply(args: Seq[String]): String =
//Do some stuff
object Play extends Command("!", "play chord"):
def apply(args: Seq[String]): String =
//Do some stuff
object Def extends Command("def", "define function"):
def apply(args: Seq[String]): String =
case Seq(_, "!", _*) =>
val name = args.head
val func = args.tail
Command.all :+ Command(s"$name", func)
s"defined $name: $func"
case _ => ""
正如您所见,不同的对象扩展了抽象类,对象 Def 是一个文本命令,您首先输入 def 进行定义,然后 apply 中的字符串 seq 将成为命令本身。正如您在 Def 中看到的,我尝试将此新命令添加到 Command-obj 中的命令序列中。但它不起作用,我无法创建val cmd = new Command(s"$name", s"Execute $name") 然后从那里开始工作。目的是让用户定义自己的命令,因为其他命令是作为扩展抽象的对象创建的,我真的不知道如何到达那里。有什么建议吗?
【问题讨论】:
-
为每个命令添加新类型感觉几乎没有意义。也许更好的方法是简单地将
Command创建为一个案例类和代表您预定义“命令”的案例类的一堆值。 -
也许是这样,但这是我得到的,而另一个人想要这样,我还能这样做吗?
-
我可能会创建一个用户可以输入的带有空 str 参数的类型,但是每次都会覆盖该命令,例如我希望用户输入?并获取命令列表 ?、:q、!、def 以及它们自己定义的命令。
标签: scala inheritance abstract-class