Pregunta Diferencia entre objeto y clase en Scala


Estoy repasando algunos tutoriales de Scala en Internet y he notado en algunos ejemplos que un objeto se declara al comienzo del ejemplo.

Cuál es la diferencia entre class y object en Scala?


517
2017-11-18 11:21


origen


Respuestas:


tl; dr

  • class C define una clase, al igual que en Java o C ++.
  • object O crea un semifallo objeto O como instancia de alguna clase anónima; se puede usar para mantener miembros estáticos que no están asociados con instancias de alguna clase.
  • object O extends T hace el objeto O una instancia de trait T; puedes pasar O en cualquier lugar, una T se espera.
  • si hay un class C, entonces object C es el objeto compañero de clase C; Tenga en cuenta que el objeto complementario es no automáticamente una instancia de C.

También vea la documentación de Scala para objeto y clase.

Uso como host de miembros estáticos

Muy a menudo, necesitas una object para mantener métodos y valores / variables que estarán disponibles sin tener que crear primero una instancia de alguna clase. Este es el uso está estrechamente relacionado con static miembros en Java.

object A {
  def twice(i: Int): Int = 2*i
}

A continuación, puede llamar al método anterior utilizando A.twice(2).

Si twice eran miembros de alguna clase A, entonces necesitarías hacer una instancia primero:

class A() {
  def twice(i: Int): Int = 2 * i
}

val a = new A()
a.twice(2)

Puedes ver cómo esto es redundante, como twice no requiere ningún dato específico de instancia.

Uso como instancia con nombre especial

También puedes usar el object en sí mismo como una instancia especial de una clase o rasgo. Cuando haces esto, tu objeto necesita extenderse un poco trait para convertirse en una instancia de una subclase de ella.

Considera el siguiente código:

object A extends B with C {
  ...
}

Esta declaración primero declara una clase anónima (inaccesible) que extiende ambos B y Ce instancia una instancia única de esta clase llamada A.

Esto significa A se puede pasar a funciones que esperan objetos de tipo B o C, o B with C.

Características adicionales de object

También existen algunas características especiales de los objetos en Scala. Recomiendo leer el documentación oficial.

  • def apply(...) permite el método habitual de sintaxis sin nombre de A(...)
  • def unapply(...) permite crear coincidencias de patrones personalizados extractores
  • si acompaña a una clase del mismo nombre, el objeto asume un papel especial al resolver parámetros implícitos

462
2017-11-18 11:59



UN class es una definición, una descripción. Define un tipo en términos de métodos y composición de otros tipos.

Un object es un singleton, una instancia de una clase que se garantiza que es única. Para cada object en el código, se crea una clase anónima, que hereda de las clases que declaraste object para implementar. Esta clase no se puede ver desde el código fuente de Scala, aunque puede lograrlo a través de la reflexión.

Hay una relación entre object y class. Se dice que un objeto es el objeto compañero de una clase si comparten el mismo nombre. Cuando esto sucede, cada uno tiene acceso a métodos de privatevisibilidad en el otro. Sin embargo, estos métodos no se importan automáticamente. O bien tiene que importarlos explícitamente, o prefijarlos con el nombre de clase / objeto.

Por ejemplo:

class X {
  // class X can see private members of object X
  // Prefix to call
  def m(x: Int) = X.f(x)

  // Import and use
  import X._
  def n(x: Int) = f(x)

  private def o = 2
}

object X {
  private def f(x: Int) = x * x

  // object X can see private members of class X
  def g(x: X) = {
    import x._
    x.o * o // fully specified and imported
   }
}

231
2017-11-18 13:24



Un objeto tiene exactamente uno instancia (no puedes llamar new MyObject) Tu puedes tener múltiple instancias de una clase.

Object sirve mismo (y algunos adicionales) propósitos como los métodos estáticos y campos en Java.


62
2017-11-18 11:59



Como ha sido explicado por muchos, object define una instancia singleton. La única cosa en las respuestas aquí que creo que se deja fuera es que object sirve para varios propósitos

  • Puede ser el objeto complementario de un class/trait, que contiene lo que podrían considerarse métodos estáticos o métodos de conveniencia.

  • Puede actuar como un módulo, que contiene tipos y definiciones relacionadas / subsidiarias, etc.

  • Puede implementar una interfaz extendiendo un class o uno o más traits.

  • Puede representar un caso de sealed trait que no contiene datos En este sentido, a menudo se considera más correcto que un case class sin parámetros El caso especial de un sealed trait con solo case object ejecutores es más o menos la versión de Scala de una enumeración.

  • Puede actuar como evidencia para implicitimpulsada por la lógica.

  • Introduce un tipo singleton.

Es una construcción muy poderosa y general. Lo que puede ser muy confuso para los principiantes de Scala es que la misma construcción puede tener usos muy diferentes. Y un object puede servir a muchos de estos diferentes usos a la vez, lo que puede ser aún más confuso.


15
2018-01-20 01:20



Definir un objeto en Scala es como definir una clase en Java que solo tenga métodos estáticos. Sin embargo, en Scala un objeto puede extender otra superclase, implementar interfaces y pasarlo como si fuera una instancia de una clase. (Así que es como los métodos estáticos en una clase, pero mejor).


14
2017-11-18 17:27



La diferencia formal -

  1. no puedes proporcionar parámetros de constructor
  2. no es un tipo; no puedes crear una instancia con un nuevo operador. Pero puede tener campos, métodos, extender una superclase y mezclar rasgos.

La diferencia en el uso:

  • Scala no tiene métodos o campos estáticos. En cambio, deberías usar object. Puedes usarlo con o sin clase relacionada. En 1er caso se llama objeto complementario. Tienes que:
    1. use el mismo nombre para clase y objeto
    2. ponerlos en el mismo archivo fuente.
  • Para crear un programa, debes usar el método principal en objectno class.

    object Hello {
      def main(args: Array[String]) {
        println("Hello, World!")
      }
    }
    
  • También puede usarlo mientras usa un objeto singleton en java.




12
2018-05-17 17:51



los objeto palabra clave crea un nuevo tipo de singleton, que es como un clase que solo tiene una sola instancia nombrada. Si está familiarizado con Java, declarar un objeto en Scala es muy parecido a crear una nueva instancia de una clase anónima.

Scala no tiene equivalente a Java estático palabra clave y una objeto a menudo se usa en Scala, donde puede usar una clase con miembros estáticos en Java.


4
2018-03-12 14:20



Objeto es una clase pero ya tiene (es) una instancia, por lo que no puedes llamar new ObjectName. Por otra parte, Clase es solo escribir y puede ser una instancia llamando new ClassName().


2
2018-06-09 17:06



Clase Scala igual que Java Class pero scala no le da ningún método de entrada en clase, como el método principal en Java. El método principal asociado con la palabra clave object. Puede pensar en la palabra clave object como la creación de un objeto singleton de una clase que se define implícitamente.

más información ver este artículo Palabra clave de clase y objeto en la programación scala


1
2018-06-22 17:52



En scala, no hay static concepto. Entonces scala crea un objeto singleton para proporcionar el punto de entrada para la ejecución de su programa. Si no crea un objeto singleton, su código se compilará correctamente pero no producirá ningún resultado. Los métodos declarados dentro de Singleton Object son accesibles globalmente. Un objeto singleton puede extender clases y rasgos.

Ejemplo de objeto de Scala Singleton

object Singleton{  
    def main(args:Array[String]){  
        SingletonObject.hello()         // No need to create object.  
    }  
}  


object SingletonObject{  
    def hello(){  
        println("Hello, This is Singleton Object")  
    }  
}  

Salida:

Hello, This is Singleton Object

En scala, cuando tienes una clase con el mismo nombre que un objeto singleton, se llama clase complementaria y el objeto singleton se llama objeto complementario.

La clase complementaria y su objeto complementario ambos deben estar definidos en el mismo archivo fuente.

Ejemplo de objeto complementario Scala

class ComapanionClass{  
    def hello(){  
        println("Hello, this is Companion Class.")  
    }  
}  
object CompanoinObject{  
    def main(args:Array[String]){  
        new ComapanionClass().hello()  
        println("And this is Companion Object.")  
    }  
}  

Salida:

Hello, this is Companion Class.
And this is Companion Object.

En scala, una clase puede contener:

1. Miembro de datos

2. Método miembro 

3. Bloque Constructor 

4. Clase anidada 

5. Información de clase superior, etc.

Debe inicializar todas las variables de instancia en la clase. No hay alcance predeterminado Si no especifica el alcance de acceso, es público. Debe haber un objeto en el que se define el método principal. Proporciona el punto de partida para su programa. Aquí, hemos creado un ejemplo de clase.

Ejemplo de muestra de Scala de clase

class Student{  
    var id:Int = 0;                         // All fields must be initialized  
    var name:String = null;  
}  
object MainObject{  
    def main(args:Array[String]){  
        var s = new Student()               // Creating an object  
        println(s.id+" "+s.name);  
    }  
} 

Lo siento, ya es demasiado tarde, pero espero que te ayude.


1
2018-03-03 08:20