Question Différence entre objet et classe à Scala


Je passe en revue quelques tutoriels Scala sur Internet et j'ai remarqué dans certains exemples qu'un objet est déclaré au début de l'exemple.

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


517
2017-11-18 11:21


origine


Réponses:


tl; dr

  • class C définit une classe, comme en Java ou en C ++.
  • object O crée un singleton objet O comme exemple de 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 rend l'objet O une instance de trait T; vous pouvez ensuite passer O partout, un T devrait.
  • s'il y a un class C, puis object C est le objet compagnon de classe C; notez que l'objet compagnon est ne pas automatiquement une instance de C.

Voir aussi la documentation de Scala pour objet et classe.

Utilisation en tant qu'hôte de membres statiques

Le plus souvent, vous avez besoin d'un object pour conserver les méthodes et les valeurs / variables qui doivent être disponibles sans devoir d'abord instancier une instance d'une classe. Ceci est l'utilisation est étroitement liée à static membres en Java.

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

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

Si twice étaient membre d'une classe A, alors vous devez d'abord créer une instance:

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

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

Vous pouvez voir comment cela est redondant, comme twice ne nécessite aucune donnée spécifique à l'instance.

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

Vous pouvez également utiliser le object lui-même comme une instance particulière d'une classe ou d'un trait. Lorsque vous faites cela, votre objet doit étendre trait afin de devenir une instance d'une sous-classe de celui-ci.

Considérez le code suivant:

object A extends B with C {
  ...
}

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

Ça signifie A peut être passé à des fonctions attendant des objets de type B ou C, ou B with C.

Caractéristiques supplémentaires de object

Il existe également des fonctionnalités spéciales d'objets dans Scala. Je recommande de lire le documentation officielle.

  • def apply(...) active la syntaxe sans nom de la méthode habituelle de A(...)
  • def unapply(...) permet de créer un motif personnalisé extracteurs
  • si elle accompagne une classe du même nom, l'objet assume un rôle spécial lors de la résolution paramètres implicites

462
2017-11-18 11:59



UNE 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 garantie d'être unique. Pour chaque object dans le code, une classe anonyme est créée, qui hérite de toutes les classes que vous avez déclarées object implémenter. Cette classe ne peut pas être vue à partir du code source de Scala - bien que vous puissiez y arriver par réflexion.

Il y a 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 privatevisibilité dans l'autre. Cependant, ces méthodes ne sont pas automatiquement importées. Vous devez soit les importer explicitement, soit les préfixer avec le nom de la classe / de l'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
   }
}

231
2017-11-18 13:24



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

Objet sert le même (et un peu plus) fins comme les méthodes statiques et les champs en Java.


62
2017-11-18 11:59



Comme cela a été expliqué par beaucoup, object définit une instance singleton. La seule chose dans les réponses ici que je crois est laissé de côté est que object sert à plusieurs fins.

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

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

  • Il peut implémenter une interface en étendant un class ou un ou plusieurs traits.

  • Il peut représenter un cas de sealed trait qui ne contient aucune donnée A 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 case object les implémenteurs sont plus ou moins la version Scala d'un enum.

  • Il peut servir de preuve pour implicitlogique 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, c'est que le même concept peut avoir des utilisations très différentes. Et un object peut servir plusieurs de ces différents usages tout à la fois, ce qui peut être encore plus déroutant.


15
2018-01-20 01:20



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


14
2017-11-18 17:27



La différence formelle -

  1. vous ne pouvez pas fournir de paramètres de constructeur
  2. ce n'est pas un type - vous ne pouvez pas créer une instance avec un nouvel opérateur. Mais il peut avoir des champs, des méthodes, étendre une super-classe et mélanger des traits.

La différence d'utilisation:

  • Scala n'a pas de méthodes ou de champs statiques. Au lieu de cela, vous devriez utiliser object. Vous pouvez l'utiliser avec ou sans classe associée. Dans le premier cas, on l'appelle un objet compagnon. Vous devez:
    1. utiliser le même nom pour la classe et l'objet
    2. mettez-les dans le même fichier source.
  • Pour créer un programme, vous devez utiliser la méthode principale dans object, ne pas class.

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




12
2018-05-17 17:51



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 connaissez Java, déclarez objet dans Scala ressemble beaucoup à créer une nouvelle instance d'une classe anonyme.

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


4
2018-03-12 14:20



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


2
2018-06-09 17:06



Scala classe même que Java Class mais scala ne vous donne aucune méthode d'entrée en classe, comme la méthode principale dans Java. La méthode principale associée au mot-clé object. Vous pouvez considérer le mot-clé object comme créant un objet singleton d'une classe définie implicitement.

plus d'informations vérifier cet article mot clé de classe et d'objet dans la programmation scala


1
2018-06-22 17:52