Diferencia entre objeto y clase en Scala
Solo estoy repasando 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?
13 answers
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 contener miembros estáticos que no están asociados con instancias de alguna clase. -
object O extends T
hace que el objetoO
sea una instancia detrait T
; luego puede pasarO
en cualquier lugar, se espera unT
. - si hay un
class C
, entoncesobject C
es el objeto compañero de la claseC
; nota que el objeto compañero es no automáticamente una instancia deC
.
También vea la documentación de Scala para objetoy clase.
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 instanciar primero una instancia de alguna clase.
Este uso está estrechamente relacionado con los 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 un miembro de alguna clase A
, entonces necesitaría hacer una instancia primero:
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 puedes usar el propio object
como una instancia especial de una clase o rasgo.
Al hacer esto, su objeto necesita extender algunos trait
para convertirse en una instancia de una subclase de se.
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 B
como C
, y crea una instancia única 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 de object
También existen algunas características especiales de los objetos en Scala. Recomiendo leer el documentación oficial.
-
def apply(...)
habilita la sintaxis habitual sin nombre del método deA(...)
-
def unapply(...)
permite crear patrones personalizados extractores - si acompaña a una clase del mismo nombre, el objeto asume un papel especial al resolver parámetros implícitos
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-27 08:47:38
A 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 an 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
implementar. Esta clase no se puede ver desde el código fuente de Scala though aunque se puede llegar a ella a través de la reflexión.
Existe 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. Usted tiene que 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
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-14 20:36:19
Un objeto tiene exactamente una instancia (no se puede llamar a new MyObject
). Puede tener múltiples instancias de una clase.
Objeto sirve a la mismo (y algunos adicionales) propósitos como los métodos y campos estáticos en Java.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-27 13:28:56
Como muchos han explicado, object
define una instancia singleton. La única cosa en las respuestas aquí que creo que se omite es que object
sirve para varios propósitos.
Puede ser el objeto compañero de un
class
/trait
, contiene lo que podrían considerarse métodos estáticos o métodos de conveniencia.Puede actuar como un módulo, conteniendo tipos y definiciones relacionados/subsidiarios, etc.
-
Puede implementar una interfaz por extendiendo un
class
o uno o mástrait
s. Puede representar un caso de un
sealed trait
que no contiene datos. En este sentido, a menudo se considera más correcto que uncase class
sin parámetros. El caso especial de unsealed trait
con solo implementadorescase object
es más o menos la versión Scala de una enumeración.Puede actuar como evidencia para la lógica impulsada por
implicit
.Introduce un tipo singleton.
Es un muy poderoso y general construir. 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.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-20 01:20:35
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 ser pasado como si fuera una instancia de una clase. (Así que es como los métodos estáticos en una clase, pero mejor).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-04 15:27:32
La diferencia formal -
- no puede proporcionar parámetros de constructor
- no es un tipo - no puede crear una instancia con un operador nuevo. Pero puede tener campos, métodos, extender una superclase y mezclar rasgos.
La diferencia en el uso:
- Scala no tiene métodos ni campos estáticos. En su lugar, debe usar
object
. Puede usarlo con o sin clase relacionada. En 1er caso se llama un objeto compañero. Tienes que:- uso el mismo nombre para la clase y el objeto
- ponlos en el mismo archivo fuente.
-
Para crear un programa debe usar el método principal en
object
, noclass
.object Hello { def main(args: Array[String]) { println("Hello, World!") } }
-
También puede usarlo como usa el objeto singleton en java.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-29 13:45:17
La palabra clave object crea un nuevo tipo singleton, que es como una clase que solo tiene una sola 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 equivalente a la palabra clave static de Java, y un objeto se usa a menudo en Scala donde se puede usar una clase con miembros estáticos en Java.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-12 14:20:14
Object es una clase pero ya tiene(es) una instancia, por lo que no puede llamar a new ObjectName
. Por otro lado, Class es solo tipo y puede ser una instancia llamando a new ClassName()
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-13 11:15:39
Clase Scala igual que 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 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 consulte este artículo palabra clave de clase y objeto en programación scala
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-22 17:52:18
En scala, no hay un 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á correctamente pero no producirá ninguna salida. 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 se tiene una clase con el mismo nombre que el objeto singleton, se llama clase companion y el objeto singleton se llama objeto companion.
La clase companion y su objeto companion deben definirse en el mismo archivo fuente.
Scala Companion Object Example
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 estupenda etc.
Debe inicializar todas las variables de instancia de la clase. No hay un ámbito predeterminado. Si no especifica el ámbito de acceso, es público. Debe haber un objeto en el que se defina el método main. Proporciona un 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, estoy demasiado tarde pero espero que te ayude.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-01 18:11:39
El objeto es igual a la clase estática en Java a algunas extensiones, las características estáticas significan que la clase estática no necesita crear un objeto al poner a la JVM, puede ser utilizado por su nombre de clase directamente
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-03 08:20:50
Si viene de un entorno 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 de tipo singleton se llama a los métodos dentro de él utilizando el nombre del objeto, en scala object es una palabra clave y en java object es una instancia de la clase
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-04 11:40:38
Clase y objeto: una clase es una definición que describe todos los atributos de una entidad o un objeto. Y objeto es una instancia de una clase.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-04 15:16:28