es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for 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:

    class UserDefinedCommand(val name: String, val func: Seq[String]) extends Command(name, "") {
      def apply(args: Seq[String]): String = ""
    }
    
    object UserDefinedCommand {
      def apply(name: String, func: Seq[String]): UserDefinedCommand = {
        val cmd = new UserDefinedCommand(name, func)
        Command.all :+ cmd
        cmd
      }
    }
    

    En esta implementación, creamos una nueva clase llamada UserDefinedCommand que extiende la clase abstracta Command y recibe como parámetros un name y un func (el comando definido por el usuario). También creamos un objeto companion que permite al usuario crear un nuevo objeto UserDefinedCommand y añadirlo a la secuencia Command.all usando el método apply.

    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:

    val myCommand = UserDefinedCommand("mycommand", Seq("println(\"¡Hola, mundo!\")"))
    

    Esto crea un nuevo objeto UserDefinedCommand con el nombre “mycommand” y la función “println(“¡Hola, mundo!”)” y lo añade a la secuencia Command.all. El usuario luego puede ejecutar el comando escribiendo “mycommand” en la línea de comandos.

Comments are closed.