所以我有一個抽象類和一堆擴展它的物件:
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")然后從那里作業。目的是讓用戶定義他們自己的命令,并且由于其他命令是作為擴展抽象的物件創建的,我真的不知道如何到達那里。有小費嗎?
uj5u.com熱心網友回復:
不確定它是否是您所指的,但這沒有任何作用,因為結果被丟棄了。
Command.all : Command(s"$name", func)
你可能是說
Command.all = Command.all : Command(s"$name", func)
uj5u.com熱心網友回復:
想出了一個解決方案:創建一個新的類,當他們name從Def類中進入時將被呼叫。如果他們想定義播放鋼琴上的一個E小調和弦他們寫一個函式:def Em ! p 64 67 71所以我Def現在name = Em和func = Seq("!", "p", "64", "71")接下來我們創建一個新的實體Defined,并在Defined val command = Seq("p", "64", "67", "71")
接下來我們添加此實體(型別Command(抽象類)命令序列物件var all: Seq[Command] = Seq(Help, Quit, Play, Def, Em),當他們進入命令“EM”現在它會呼叫的應用功能Play與func = Seq("!", "p", "64", "71")在這里發揮自己的應用功能。一個顯著的缺陷是定義略施并不需要args: Seq[String],但由于型別的所有其他物件的命令需要在一個序列為了在呼叫命令時提供資料,我不知道如何避免它。
class Defined extends Command(s"${Def.name}", s"Execute the function ${Def.name}"){
//New function every new instance
val command = Def.func.tail
def apply(args: Seq[String]): String =
Play(command)
}
基于他們在 Def 命令中輸入的內容的新類:
object Def extends Command("def", "Define function"):
var name = ""
var func = Seq("")
def apply(args: Seq[String]): String = args match
case Seq(_, "!", _*) =>
name = args.head //Ex. Em
func = args.tail //Ex. ! p 64 67 71
Command.cmdSet.add(new Defined)
s"defined $name: ${func.mkString(" ")}"
case _ => ""
def getName: String = name
def getFunc: Seq[String] = func
正如蒂姆指出的那樣,如果我不更改var allin 會更好,Command所以我將其修改為:
class CommandSet:
private var commandSet: Seq[Command] = Seq(Help, Quit, Play, Def)
def add(command: Command): Unit =
commandSet = commandSet : command
def get: Seq[Command] =
commandSet
object Command:
val cmdSet = new CommandSet
def all: Seq[Command] = cmdSet.get
創建了一個類,其目的是保存命令序列。所以現在在Def我訪問val cmdSet: commandSet和使用該add函式然后在object Command而不是命令序列是一個 var 它現在def all: Seq[String] = cmdSet.get回傳類中的私有序列CommandSet
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/381348.html
下一篇:MVC5中的繼承
