Creando un objeto que extienda una clase abstracta y añadiéndolo a una secuencia del tipo clase abstracta en Scala.
Así que tengo una clase abstracta y un montón de objetos que la extienden:
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 =
//Hacer algo
object Help extends Command("?","imprimir ayuda"):
def apply(args: Seq[String]): String =
//Hacer algo
object Quit extends Command(":q", "salir de esta aplicación"):
def apply(args: Seq[String]): String =
//Hacer algo
object Play extends Command("!", "tocar acorde"):
def apply(args: Seq[String]): String =
//Hacer algo
object Def extends Command("def", "definir función"):
def apply(args: Seq[String]): String =
case Seq(_, "!", _*) =>
val name = args.head
val func = args.tail
Command.all :+ Command(s"$name", func)
s"definido $name: $func"
case _ => ""
Como puedes ver, los diferentes objetos extienden la clase abstracta, el objeto Def es un comando de texto donde primero ingresas “def” para definirlo y luego la secuencia de cadenas en apply será el propio comando. Como puedes ver en Def, intento agregar este nuevo comando a la secuencia de comandos en el objeto Command. Pero no funciona, y no puedo crear un val cmd = new Command(s"$name", s"Ejecutar $name")
y luego trabajar a partir de ahí. El propósito es permitir que el usuario defina su propio comando y como los otros comandos se crean como objetos que extienden la clase abstracta, no sé realmente cómo llegar allí. ¿Algún consejo?
davy.ai
Una forma de lograr la funcionalidad deseada es crear una nueva clase que extienda la clase abstracta Command y permita al usuario definir sus propios comandos. Aquí tienes una implementación de ejemplo:
En esta implementación, creamos una nueva clase llamada
UserDefinedCommand
que extiende la clase abstractaCommand
y recibe como parámetros unname
y unfunc
(el comando definido por el usuario). También creamos un objeto companion que permite al usuario crear un nuevo objetoUserDefinedCommand
y añadirlo a la secuenciaCommand.all
usando el métodoapply
.Ahora, el usuario puede definir su propio comando creando un nuevo objeto
UserDefinedCommand
y pasando el nombre del comando y la función como parámetros. Por ejemplo:Esto crea un nuevo objeto
UserDefinedCommand
con el nombre “mycommand” y la función “println(“¡Hola, mundo!”)” y lo añade a la secuenciaCommand.all
. El usuario luego puede ejecutar el comando escribiendo “mycommand” en la línea de comandos.