745 Stimmen

Der Unterschied zwischen Objekt und Klasse in Scala

Ich gehe gerade einige Scala-Tutorials im Internet durch und habe festgestellt, dass in einigen Beispielen ein Objekt am Anfang des Beispiels deklariert wird.

Was ist der Unterschied zwischen class y object in Scala?

693voto

ziggystar Punkte 27565

Tl;dr

  • class C definiert eine Klasse, genau wie in Java oder C++.
  • object O erstellt eine Einzelperson Objekt O als Instanz einer anonymen Klasse; sie kann verwendet werden, um statische Mitglieder zu speichern, die nicht mit Instanzen einer Klasse verbunden sind.
  • object O extends T macht das Objekt O eine Instanz von trait T ; Sie können dann O irgendwo, ein T wird erwartet.
  • wenn es eine class C dann object CBegleitobjekt der Klasse C Beachten Sie, dass das Begleitobjekt pas automatisch eine Instanz von C .

Siehe auch Scala-Dokumentation für Objekt y Klasse .

object als Gastgeber der statischen Mitglieder

In den meisten Fällen benötigen Sie eine object um Methoden und Werte/Variablen zu speichern, die verfügbar sein sollen, ohne dass zuerst eine Instanz einer Klasse instanziert werden muss. Diese Verwendung ist eng verwandt mit static Mitglieder in Java.

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

Sie können dann die obige Methode mit A.twice(2) .

Wenn twice ein Mitglied einer Klasse waren A dann müssen Sie zuerst eine Instanz erstellen:

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

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

Sie können sehen, wie überflüssig dies ist, da twice benötigt keine instanzspezifischen Daten.

object als eine spezielle benannte Instanz

Sie können auch die object selbst als eine spezielle Instanz einer Klasse oder eines Traits. Wenn Sie dies tun, muss Ihr Objekt einige trait um eine Instanz einer Unterklasse davon zu werden.

Betrachten Sie den folgenden Code:

object A extends B with C {
  ...
}

Diese Deklaration deklariert zunächst eine anonyme (unzugängliche) Klasse, die sowohl die B y C und instanziiert eine einzelne Instanz dieser Klasse namens A .

Dies bedeutet A kann an Funktionen übergeben werden, die Objekte des Typs B o C o B with C .

Zusätzliche Merkmale von object

Es gibt auch einige besondere Eigenschaften von Objekten in Scala. Ich empfehle die Lektüre der offizielle Dokumentation .

  • def apply(...) ermöglicht die übliche methodennamenlose Syntax von A(...)
  • def unapply(...) ermöglicht die Erstellung benutzerdefinierter Mustervergleiche Extraktoren
  • wenn es eine gleichnamige Klasse begleitet, nimmt das Objekt bei der Auflösung eine besondere Rolle ein implizite Parameter

40 Stimmen

Es wird auch die Klasse A definieren und alle Methoden in Objekt A als statische Methoden der Klasse A erstellen (für die Schnittstelle zu Java). (Bis auf einen Fehler in Scala 2.7, der in Scala 2.8 behoben wurde)

2 Stimmen

@KenBloom wirklich? Ich habe es versucht und es funktioniert nicht: scala> Commerce res8: Commerce.type = Commerce$@6eb2756 scala> classOf[Commerce] <console>:23: error: not found: type Commerce classOf[Commerce] ^ scala> new Commerce <console>:23: error: not found: type Commerce new Commerce ^

3 Stimmen

@Hendy: Scala erkennt nicht die Commerce Klasse, aber die JVM und die Java-Sprache schon. (So können Sie object Foo{ def main(args:Seq[String]) } und erwarten, dass das Programm läuft.)

259voto

Daniel C. Sobral Punkte 290004

A class ist eine Definition, eine Beschreibung. Sie definiert einen Typ in Form von Methoden und Komposition anderer Typen.

Eine object ist ein Singleton - eine Instanz einer Klasse, die garantiert einzigartig ist. Für jede object im Code wird eine anonyme Klasse erstellt, die von den von Ihnen deklarierten Klassen erbt object zu implementieren. Diese Klasse ist aus dem Scala-Quellcode nicht ersichtlich - allerdings kann man sie über Reflection erreichen.

Es besteht eine Beziehung zwischen object y class . Ein Objekt wird als Begleitobjekt einer Klasse bezeichnet, wenn sie denselben Namen haben. Wenn dies der Fall ist, hat jedes Objekt Zugriff auf die Methoden von private Sichtbarkeit auf der anderen Seite. Diese Methoden werden jedoch nicht automatisch importiert. Sie müssen sie entweder explizit importieren oder ihnen den Klassen-/Objektnamen voranstellen.

Zum Beispiel:

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

1 Stimmen

Entschuldigen Sie die Störung, aber könnten Sie vielleicht auf ein Beispiel verweisen, wie man Methoden in das Begleitobjekt importiert oder wie man sie vorangestellt bekommt?

4 Stimmen

@ithkuil Erledigt. Entschuldigung für das dumme Beispiel, mir ist kein gutes und kurzes eingefallen.

0 Stimmen

Was ist, wenn ich die Methoden einer Klasse in Object verwenden möchte? Wäre das möglich? Wenn ich eine Methode einer Klasse habe und sie in Object verwenden möchte, dann wird das nicht möglich sein, wenn man versucht, die Klasse zu importieren. Letztendlich muss man einen Konstruktor erstellen und die Methode dann aufrufen. Wenn man also ein Companion-Objekt erstellt, kann man über den Import auf die Methoden von Object zugreifen, aber nicht umgekehrt. Kann das bitte jemand bestätigen?

82voto

Thomas Jung Punkte 31524

Ein Objekt hat genau eine Instanz (Sie können nicht new MyObject ). Sie können haben mehrere Instanzen einer Klasse.

Das Objekt dient der dieselbe (und einige zusätzliche) Zwecke wie die statischen Methoden und Felder in Java.

23voto

acjay Punkte 31336

Wie bereits von vielen erklärt wurde, object definiert eine Singleton-Instanz. Das einzige, was in den Antworten hier meiner Meinung nach ausgelassen wird, ist, dass object dient mehreren Zwecken.

  • Es kann das Begleitobjekt zu einem class / trait , die so genannte statische Methoden oder Komfortmethoden enthalten.

  • Es kann sich ähnlich wie ein Modul verhalten und verwandte/untergeordnete Typen und Definitionen usw. enthalten.

  • Es kann eine Schnittstelle implementieren, indem es eine class oder eine oder mehrere trait s.

  • Es kann sich um einen Fall von sealed trait die keine Daten enthält. In dieser Hinsicht wird sie oft als korrekter angesehen als eine case class ohne Parameter. Der Sonderfall einer sealed trait mit nur case object Implementierer ist mehr oder weniger die Scala-Version eines Enums.

  • Sie kann als Beweismittel dienen für implicit -gesteuerten Logik.

  • Es wird ein Singleton-Typ eingeführt.

Es ist ein sehr mächtiges und allgemeines Konstrukt. Was für Scala-Anfänger sehr verwirrend sein kann, ist, dass ein und dasselbe Konstrukt sehr unterschiedliche Verwendungen haben kann. Und eine object kann viele dieser verschiedenen Verwendungszwecke gleichzeitig erfüllen, was noch verwirrender sein kann.

22voto

Ken Bloom Punkte 54770

Die Definition eines Objekts in Scala ist wie die Definition einer Klasse in Java, die nur statische Methoden hat. Allerdings kann ein Objekt in Scala eine andere Oberklasse erweitern, Schnittstellen implementieren und so weitergegeben werden, als wäre es eine Instanz einer Klasse. (Es ist also wie die statischen Methoden einer Klasse, nur besser).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X