metodos - Diferencia entre objeto y clase en Scala
scala sintaxis (13)
Solo estoy revisando algunos tutoriales de Scala en Internet y he notado que en algunos ejemplos se declara un objeto al comienzo del ejemplo.
¿Cuál es la diferencia entre class
y object
en Scala?
tl; dr
-
class C
define una clase, al igual que en Java o C ++. -
object O
crea un objeto singletonO
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 que el objetoO
una instancia deltrait T
; luego puedes pasarO
cualquier parte, se espera unaT
- si hay una
class C
, entonces elobject C
es el objeto complementario de la claseC
; tenga en cuenta que el objeto complementario no es automáticamente una instancia deC
También vea la documentación de Scala para el object y la class .
Uso como anfitrión de miembros estáticos
La mayoría de las veces, necesita un object
para contener métodos y valores / variables que estarán disponibles sin tener que crear una instancia de una instancia de alguna clase. Este uso está estrechamente relacionado con static
miembros static
en Java.
object A {
def twice(i: Int): Int = 2*i
}
Luego puede llamar al método anterior usando A.twice(2)
.
Si twice
fuera miembro de alguna clase A
, primero tendría que crear una instancia:
class A() {
def twice(i: Int): Int = 2 * i
}
val a = new A()
a.twice(2)
Puede ver cómo esto es redundante, ya que twice
no requiere ningún dato específico de la instancia.
Uso como una instancia con nombre especial
También puede usar el object
sí como una instancia especial de una clase o rasgo. Cuando haces esto, tu objeto necesita extender algún trait
para convertirse en una instancia de una subclase de él.
Considere el siguiente código:
object A extends B with C {
...
}
Esta declaración declara primero una clase anónima (inaccesible) que se extiende tanto a B
como a C
, y crea una instancia de esta clase llamada A
Esto significa que A
se puede pasar a funciones que esperan objetos de tipo B
o C
, o B with C
Características adicionales del object
También existen algunas características especiales de los objetos en Scala. Recomiendo leer la object .
-
def apply(...)
habilita la sintaxis sin nombre del método habitual deA(...)
-
def unapply(...)
permite crear extractors coincidencia de patrones personalizados - Si acompaña a una clase del mismo nombre, el objeto asume un rol especial al resolver los parámetros implícitos.
Clase y objeto: una clase es una definición que describe todos los atributos de una entidad o un objeto. Y el objeto es una instancia de una clase.
Como ha sido explicado por muchos, el object
define una instancia de singleton. Lo único en las respuestas aquí que creo que queda fuera es que el object
cumple varios propósitos.
Puede ser el objeto complementario de una
class
/trait
, que contiene lo que podría considerarse métodos estáticos o métodos convenientes.Puede actuar como un módulo, que contiene tipos y definiciones relacionadas / subsidiarias, etc.
Puede implementar una interfaz extendiendo una
class
o uno o mástrait
.Puede representar un caso de un
sealed trait
que no contiene datos. En este sentido, a menudo se considera más correcto que unacase class
sin parámetros. El caso especial de unsealed trait
con solo implementadores decase object
es más o menos la versión Scala de una enumeración.Puede actuar como evidencia para la lógica impulsada
implicit
.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.
Definir un objeto en Scala es como definir una clase en Java que solo tiene métodos estáticos. Sin embargo, en Scala, un objeto puede extender otra superclase, implementar interfaces y transmitirse como si fuera una instancia de una clase. (Así es como los métodos estáticos en una clase pero mejor).
El objeto es igual a la clase estática en Java, algunas características estáticas significan que la clase estática no necesita crear un objeto cuando se coloca en la JVM, puede ser usado por su nombre de clase directamente
En scala, no hay concepto static
. Así que Scala crea un objeto singleton para proporcionar un punto de entrada para la ejecución de su programa. Si no crea un objeto singleton, su código se compilará con éxito pero no producirá ningún resultado. Los métodos declarados dentro del objeto Singleton son accesibles globalmente. Un objeto singleton puede extender clases y rasgos.
Ejemplo de objeto 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 tiene una clase con el mismo nombre que el objeto singleton, se denomina clase complementaria y el objeto singleton se denomina objeto complementario.
La clase compañera y su objeto compañero deben estar definidos en el mismo archivo fuente.
Ejemplo Scala Companion Object
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 la super clase, etc.
Debe inicializar todas las variables de instancia en la clase. No hay un alcance por defecto. Si no especifica el alcance de acceso, es público. Debe haber un objeto en el que se define el método principal. Proporciona punto de partida para su programa. Aquí, hemos creado un ejemplo de clase.
Ejemplo de Scala Ejemplo 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, llego demasiado tarde pero espero que te sirva de ayuda.
La clase Scala es igual que la clase Java, 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 a la palabra clave objeto. Puede pensar que la palabra clave del objeto crea un objeto singleton de una clase que se define implícitamente.
más información, consulte esta clase de artículo y palabra clave de objeto en la programación de Scala
La diferencia formal -
- no puede proporcionar parámetros de constructor para objetos
- El objeto no es un tipo; no puede crear una instancia con un nuevo operador. Pero puede tener campos, métodos, extender una superclase y mezclar rasgos.
La diferencia de uso:
- Scala no tiene métodos ni campos estáticos. En su lugar, debe utilizar el
object
. Puedes usarlo con o sin clase relacionada. En el primer caso se llama un objeto compañero. Tienes que:- usa el mismo nombre para la clase y el objeto
- Póngalos en el mismo archivo fuente.
Para crear un programa, debe usar el método principal en el
object
, no en laclass
.object Hello { def main(args: Array[String]) { println("Hello, World!") } }
También puede usarlo mientras usa el objeto singleton en java.
La palabra clave del objeto crea un nuevo tipo de singleton, que es como una clase que solo tiene una única instancia con nombre. 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 un equivalente a la palabra clave estática de Java, y un objeto se usa a menudo en Scala, donde puede usar una clase con miembros estáticos en Java.
Si viene de Java, el concepto de clase en scala es similar a Java, pero la clase en scala no puede contener miembros estáticos.
Los objetos en scala son tipos singleton a los que llama métodos dentro de él usando el nombre del objeto, en el objeto scala es una palabra clave y en el objeto java es una instancia de clase
Un objeto tiene exactamente una instancia (no se puede llamar a new MyObject
). Puedes tener múltiples instancias de una clase.
El objeto tiene los mismos propósitos (y algunos adicionales) que los métodos y campos estáticos en Java.
Una 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 cualquier clase que haya declarado object
para implementar. Esta clase no se puede ver desde el código fuente de Scala, aunque se puede obtener 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 visibilidad private
en el otro. Sin embargo, estos métodos no se importan automáticamente. Debe importarlos explícitamente o prefijarlos con el nombre de la 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
}
}
El objeto es una clase pero ya tiene (es) una instancia, por lo que no puede llamar al new ObjectName
. Por otro lado, la clase es solo de tipo y puede ser una instancia al llamar a new ClassName()
.