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?
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?
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.class C
dann object C
は Begleitobjekt 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 MitgliederIn 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 InstanzSie 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
.
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
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)
@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 ^
@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.)
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
}
}
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?
@ithkuil Erledigt. Entschuldigung für das dumme Beispiel, mir ist kein gutes und kurzes eingefallen.
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?
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.
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 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.