Différence entre l'objet et la classe dans Scala

je suis en train de passer en revue quelques tutoriels Scala sur Internet et j'ai remarqué dans quelques exemples qu'un objet est déclaré au début de l'exemple.

Quelle est la différence entre class et object en Scala?

524
demandé sur Michal Kordas 2009-11-18 14:21:58

13 réponses

tl; dr

  • class C définit une classe, tout comme en Java ou en C++.
  • object O crée un singleton object O comme instance d'une classe anonyme; il peut être utilisé pour contenir des membres statiques qui ne sont pas associés à des instances d'une classe.
  • object O extends T fait l'objet O une instance de trait T ; vous pouvez alors passer O n'importe où, un T est prévu.
  • s'il y a un class C , alors object C est le objet compagnon de la classe C ; notez que l'objet compagnon est et non automatiquement une instance de C .

Voir aussi la documentation de Scala pour objet et classe .

utilisation comme hôte des éléments statiques

le plus souvent, vous avez besoin d'un object pour contenir les méthodes et les valeurs/variables qui doivent être disponibles sans avoir à instancier une instance de quelque classe. Cette utilisation est étroitement liée aux membres static en Java.

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

vous pouvez alors appeler la méthode ci-dessus en utilisant A.twice(2) .

si twice était un membre d'une certaine classe A , alors vous auriez besoin de faire un première instance:

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

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

vous pouvez voir comment cela est redondant, car twice ne nécessite pas de données spécifiques à une instance.

Usage en tant qu'instance spéciale nommée

vous pouvez également utiliser le object lui-même comme une instance spéciale d'une classe ou trait. Lorsque vous faites cela, votre objet doit étendre certains trait afin de devenir une instance d'une sous-classe.

considérer le code suivant:

object A extends B with C {
  ...
}

cette déclaration déclare d'abord une classe anonyme (inaccessible) qui étend à la fois B et C , et instancie une seule instance de cette classe nommée A .

cela signifie que A peut être passé à des fonctions s'attendant à des objets de type B ou C , ou B with C .

Caractéristiques Supplémentaires de object

il existe aussi quelques particularités des objets en Scala. Je recommande de lire la documentation officielle .

  • def apply(...) active la syntaxe usuelle sans nom de la méthode A(...)
  • def unapply(...) permet de créer un motif personnalisé correspondant Extracteurs
  • s'accompagnant d'une classe du même nom, l'objet assume un rôle particulier lors de la résolution de paramètres implicites
472
répondu ziggystar 2018-01-27 08:47:38

Un class est une définition, une description. Il définit un type en termes de méthodes et de composition d'autres types.

Un object est un singleton -- une instance d'une classe qui est garanti pour être unique. Pour chaque object dans le code, une classe anonyme est créée, qui hérite de n'importe quelle classe que vous avez déclaré object à mettre en œuvre. Cette classe ne peut pas être vue à partir du code source de Scala -- bien que vous puissiez y arriver par la réflexion.

Il existe une relation entre object et class . Un objet est dit être l'objet-compagnon d'une classe s'ils partagent le même nom. Lorsque cela se produit, chacun a accès à des méthodes de visibilité private dans l'autre. Ces méthodes ne sont pas automatiquement importés. Vous devez soit les importer explicitement, soit les préfixer avec le nom de classe/objet.

par exemple:

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
   }
}
233
répondu Daniel C. Sobral 2015-05-14 20:36:19

un objet a exactement une instance (vous ne pouvez pas appeler new MyObject ). Vous pouvez avoir plusieurs instances d'une classe.

sert L'objet même (et quelques autres) purposes comme les méthodes statiques et les champs en Java.

63
répondu Thomas Jung 2013-05-27 13:28:56

comme beaucoup l'ont expliqué, object définit une instance simple. La seule chose dans les réponses ici que je crois être écartée est que object sert à plusieurs fins.

  • Il peut être le compagnon de l'objet à un class / trait , contenant ce qui pourrait être considéré comme statique des méthodes ou des méthodes pratiques.

  • il peut agir un peu comme un module, contenant types et définitions connexes/subsidiaires, etc.

  • Il peut mettre en œuvre une interface par extension d'une class ou un ou plusieurs trait .

  • Il peut représenter un cas de sealed trait qui ne contient pas de données. À cet égard, il est souvent considéré comme plus correct qu'un case class sans paramètres. Le cas particulier d'un sealed trait avec seulement des case object est plus ou moins la version Scala d'un enum.

  • Il peut agir comme une preuve de implicit piloté par la logique.

  • il introduit un type singleton.

c'est une construction très puissante et générale. Ce qui peut être très déroutant pour les débutants de Scala est que la même construction peut avoir des utilisations très différentes. Et un object peut servir beaucoup de ces différents usages tous tout de suite, ce qui peut être encore plus déroutant.

16
répondu acjay 2015-01-20 01:20:35

définir un objet en Scala est comme définir une classe en Java qui n'a que des méthodes statiques. Cependant, dans Scala un objet peut étendre une autre superclasse, implémenter des interfaces, et être transmis comme s'il s'agissait d'une instance d'une classe. (C'est comme les méthodes statiques de classe mais en mieux).

14
répondu Ken Bloom 2014-10-04 15:27:32

la différence formelle -

  1. vous ne pouvez pas fournir les paramètres du constructeur
  2. ce n'est pas un type - vous ne pouvez pas créer une instance avec new operator. Mais il peut avoir des champs, des méthodes, étendre une superclasse et mélanger des traits.

la différence d'usage:

  • Scala n'a pas de méthodes statiques ou dans les champs. Vous devez plutôt utiliser object . Vous pouvez l'utiliser avec ou sans classe. Dans le premier cas, ça s'appelle un objet compagnon. Vous devez:
    1. utilisez le même nom pour la classe et l'objet
    2. mettre dans le même fichier source.
  • Pour créer un programme, vous devez utiliser la méthode object , pas class .

    object Hello {
      def main(args: Array[String]) {
        println("Hello, World!")
      }
    }
    
  • vous pouvez également l'utiliser comme vous utilisez objet singleton en java.



        

      

12
répondu irudyak 2017-10-29 13:45:17

le objet mot-clé crée un nouveau type singleton, qui est comme un classe qui n'a qu'une seule instance nommée. Si vous êtes familier avec Java, déclarer un objet dans Scala est un peu comme créer une nouvelle instance d'une classe anonyme.

Scala n'a pas d'équivalent de Java statique mot-clé, et un objet est souvent utilisé dans Scala où vous peut utiliser une classe avec des membres statiques en Java.

4
répondu Amine Sagaama 2017-03-12 14:20:14

Object est une classe mais elle a déjà(est) une instance, donc vous ne pouvez pas appeler new ObjectName . D'un autre côté, Classe est juste un type et il peut être une instance en appelant new ClassName() .

2
répondu Yonggoo Noh 2018-05-13 11:15:39

Classe Scala identique à la classe Java mais scala ne vous donne aucune méthode d'entrée en classe, comme la méthode principale en java. La méthode principale associée au mot-clé objet. Vous pouvez penser que le mot-clé objet crée un objet unique d'une classe qui est défini implicitement.

plus d'informations, consultez cet article de la classe et de l'objet de mot-clé dans la scala de programmation

1
répondu FOD 2017-06-22 17:52:18

à scala, il n'y a pas de concept static . Scala crée un objet singleton pour fournir de point d'entrée pour l'exécution du programme. Si vous ne créez pas d'objet singleton, votre code compilera avec succès mais ne produira aucune sortie. Les méthodes déclarées à L'intérieur de L'objet Singleton sont accessibles globalement. Un objet unique peut étendre les classes et les traits.

Scala Objet Singleton Exemple

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


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

sortie:

Hello, This is Singleton Object

en scala, quand vous avez une classe avec le même nom que singleton object, il est appelé companion class et l'objet singleton est appelé companion object.

la classe companion et son objet companion doivent tous deux être définis dans le même fichier source.

Scala Compagnon Objet Exemple

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.")  
    }  
}  

sortie:

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

dans scala, une classe peut contenir:

1. Membre de données

2. Méthode du membre

3. Bloc Constructeur

4. Classe imbriquée

5. Super classe, des informations, etc ...

vous devez initialise toutes les variables d'instance dans la classe. Il n'est pas portée par défaut. Si vous ne spécifiez pas la portée d'accès, elle est publique. Il doit y avoir un objet dans laquelle la méthode est définie. Il fournit un point de départ pour votre programme. Ici, nous avons créé un exemple de classe.

Scala exemple D'échantillon de classe

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);  
    }  
} 

je suis désolé, je suis en retard mais j'espère que cela vous aidera.

1
répondu Bhaskar Das 2017-11-01 18:11:39

l'objet est égal à la classe statique en Java à certains s'étend, les caractéristiques statiques signifie la classe statique n'ont pas besoin de créer un objet lors de la mise à la JVM,il peut être utilisé par son nom de classe directement

0
répondu David 2017-03-03 08:20:50

si vous venez de java background le concept de classe en scala est un peu similaire à Java, mais la classe en scala cant contient des membres statiques.

les objets en scala sont des méthodes de type singleton que vous appelez à l'intérieur en utilisant le nom de l'objet, en Scala l'objet est un mot-clé et en java l'objet est une instance de classe

0
répondu Vivek 2018-10-04 11:40:38

Class & objet: une classe est une définition qui décrit tous les attributs d'une entité ou d'un objet. Et l'objet est une instance d'une classe.

-22
répondu ABHAY PRATAP SINGH 2014-01-04 15:16:28