Różnica między obiektem a klasą w Scali
Przeglądam samouczki Scali w Internecie i zauważyłem, że w niektórych przykładach obiekt jest deklarowany na początku przykładu.
Jaka jest różnica między class
a object
w Scali?
13 answers
Tl;dr
-
class C
definiuje klasę, tak jak w Javie lub c++. -
object O
tworzy obiekt singletonO
jako instancję jakiejś anonimowej klasy; może być używany do przechowywania statycznych członków, które nie są powiązane z instancjami jakiejś klasy. -
object O extends T
sprawia, że obiektO
jest instancjątrait T
; można następnie przekazaćO
w dowolnym miejscu, oczekuje sięT
. - jeśli istnieje
class C
, toobject C
jest obiektem towarzyszącym klasyC
; Uwaga że obiekt towarzyszący jest , a nie automatycznie instancjąC
.
Zobacz także dokumentację Scali dla object i class .
Użycie jako host statycznych członków
Najczęściej potrzebujesz object
do przechowywania metod i wartości/zmiennych, które powinny być dostępne bez konieczności tworzenia pierwszej instancji instancji jakiejś klasy.
Jest to użycie ściśle związane z static
członków w Javie.
object A {
def twice(i: Int): Int = 2*i
}
Możesz następnie wywołać powyższą metodę za pomocą A.twice(2)
.
Jeśli twice
są członkami jakiejś klasy A
, wtedy trzeba najpierw utworzyć instancję:
class A() {
def twice(i: Int): Int = 2 * i
}
val a = new A()
a.twice(2)
Możesz zobaczyć, jak to jest zbędne, ponieważ twice
nie wymaga żadnych danych specyficznych dla instancji.
Użycie jako specjalnej instancji nazwanej
Możesz również użyć samej object
jako jakiejś specjalnej instancji klasy lub cechy.
Kiedy to zrobisz, twój obiekt musi rozszerzyć niektóre trait
, aby stać się instancją podklasy to.
Rozważ następujący kod:
object A extends B with C {
...
}
Ta deklaracja najpierw deklaruje anonimową (niedostępną) klasę, która rozszerza zarówno B
, jak i C
, i tworzy instancję pojedynczej instancji tej klasy o nazwie A
.
Oznacza to, że A
mogą być przekazywane do funkcji oczekujących obiektów typu B
lub C
, lub B with C
.
Dodatkowe Funkcje object
Istnieją również pewne specjalne cechy obiektów w Scali. Polecam przeczytać oficjalna dokumentacja .
-
def apply(...)
włącza zwykłą składnię bez nazwy metodyA(...)
-
def unapply(...)
pozwala na tworzenie własnych wzorców dopasowujących ekstraktory
Jeśli obiekt dołącza do klasy o tej samej nazwie, to przy rozwiązywaniu niejawnych parametrów obiekt przyjmuje szczególną rolę]}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-27 08:47:38
A class
to definicja, opis. Definiuje typ pod względem metod i składu innych typów.
An object
jest singletonem-instancją klasy, która jest gwarantowana jako unikalna. Dla każdego object
w kodzie tworzona jest anonimowa klasa, która dziedziczy z klas, które zadeklarowałeś object
do zaimplementowania. Ta klasa nie może być widziana z kodu źródłowego Scali-chociaż można ją uzyskać poprzez odbicie.
Istnieje zależność pomiędzy object
i class
. Mówi się, że obiekt jest towarzyszem klasy, jeśli ma tę samą nazwę. Gdy tak się dzieje, każda ma dostęp do metod widoczności private
w drugiej. Metody te nie są jednak automatycznie importowane. Musisz albo zaimportować je jawnie, albo dodać prefiks z nazwą klasy / obiektu.
Na przykład:
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/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-14 20:36:19
Obiekt ma dokładnie jedną instancję (nie można wywołać new MyObject
). Możesz mieć Wiele instancji klasy.
Obiekt służy Tym Samym (i kilku dodatkowym) celom jako statyczne metody i pola w Javie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-27 13:28:56
Jak wielu tłumaczy, object
definiuje instancję Singletona. Jedyną rzeczą w odpowiedziach tutaj, która moim zdaniem została pominięta, jest to, że object
służy kilku celom.
Może być obiektem towarzyszącym
class
/trait
, zawierające to, co można uznać za metody statyczne lub metody wygody.Może działać podobnie jak moduł, zawierający powiązane / zależne typy i definicje itp.
-
Może zaimplementować interfejs poprzez rozszerzenie
class
lub jednego lub więcejtrait
s. Może reprezentować przypadek
sealed trait
, który nie zawiera danych. Pod tym względem często uważa się ją za bardziej poprawną niżcase class
bez parametrów. Szczególnym przypadkiemsealed trait
z implementatoramicase object
jest mniej więcej Wersja enum w Scali.Może działać jako dowód dla
implicit
- driven logic.Wprowadza Typ singleton.
To bardzo potężny i ogólny konstruuj. Co może być bardzo mylące dla początkujących Scali Jest to, że ta sama konstrukcja może mieć znacznie różne zastosowania. A object
może służyć wielu z tych różnych zastosowań jednocześnie, co może być jeszcze bardziej mylące.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-20 01:20:35
Definiowanie obiektu w Scali Jest jak definiowanie klasy w Javie, która ma tylko statyczne metody. Jednak w Scali obiekt może rozszerzać kolejną superklasę, implementować interfejsy i być przekazywany tak, jakby był instancją klasy. (Czyli to jak statyczne metody na klasie, ale lepsze).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-04 15:27:32
Różnica formalna -
- nie można podać parametrów konstruktora
- to nie jest typ - nie można utworzyć instancji z nowym operatorem. Ale może mieć pola, metody, rozszerzać superklasę i mieszać cechy.
Różnica w użyciu:
- Scala nie ma statycznych metod ani pól. Zamiast tego powinieneś użyć
object
. Możesz go używać z powiązaną klasą lub bez niej. W pierwszym przypadku nazywa się to obiektem towarzyszącym. Musisz:- użycie ta sama nazwa zarówno dla klasy jak i obiektu
- umieść je w tym samym pliku źródłowym.
-
Aby utworzyć program należy użyć głównej metody w
object
, a nieclass
.object Hello { def main(args: Array[String]) { println("Hello, World!") } }
-
Można go również używać jako obiekt singleton w Javie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-29 13:45:17
Słowo kluczowe object tworzy nowy typ singleton, który jest podobny do klasy , która ma tylko jedną nazwaną instancję. Jeśli znasz Javę, deklarowanie obiektu w Scali jest podobne do tworzenia nowej instancji anonimowej klasy.
Scala nie ma odpowiednika słowa kluczowego static, a obiekt jest często używany w Scali, gdzie można użyć klasy ze statycznymi członkami w Javie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-12 14:20:14
Obiekt jest klasą, ale ma już(jest) instancję, więc nie można wywołać new ObjectName
. Z drugiej strony, klasa jest po prostu typem i może być instancją przez wywołanie new ClassName()
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-13 11:15:39
Klasa Scala taka sama jak Klasa Java, ale scala nie daje żadnej metody wejściowej w klasie, jak główna metoda w Javie. Główna metoda powiązana ze słowem kluczowym object. Słowo kluczowe object można traktować jako obiekt singleton klasy zdefiniowanej domyślnie.
Więcej informacji w tym artykule słowo kluczowe klasy I obiektu w programowaniu scala
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-22 17:52:18
W Scali nie ma static
pojęcia. Scala tworzy więc obiekt singleton, aby zapewnić punkt wejścia dla wykonania programu.
Jeśli nie utworzysz obiektu singleton, Twój kod zostanie skompilowany pomyślnie, ale nie wygeneruje żadnego wyjścia. Metody zadeklarowane wewnątrz obiektu Singleton są dostępne globalnie. Obiekt singleton może rozszerzać klasy i cechy.
Przykład Obiektu 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")
}
}
Wyjście:
Hello, This is Singleton Object
W Scali, gdy masz zajęcia z ta sama nazwa, co obiekt singleton, nazywa się klasą companion, a obiekt singleton nazywa się obiektem companion.
Klasa towarzysząca i jej obiekt towarzyszący muszą być zdefiniowane w tym samym pliku źródłowym.
Przykład Obiektu Towarzyszącego Scala
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.")
}
}
Wyjście:
Hello, this is Companion Class.
And this is Companion Object.
W Scali klasa może zawierać:
1. Data member
2. Metoda Member
3. Blok Konstruktora
4. Klasa zagnieżdżona
5. Informacje o Super klasie itp.
Musisz zainicjalizować wszystkie zmienne instancji w klasie. Nie ma domyślnego zakresu. Jeśli nie określisz zakresu dostępu, jest on publiczny. Musi istnieć obiekt, w którym jest zdefiniowana główna metoda. Stanowi punkt wyjścia dla Twojego programu. Tutaj stworzyliśmy przykład klasy.
Scala przykładowy przykład klasy
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);
}
}
Przepraszam, spóźniłem się, ale mam nadzieję, że to ci pomoże.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-01 18:11:39
Obiekt jest równy klasie statycznej w Javie dla niektórych rozszerzeń, właściwości statyczne oznaczają, że Klasa statyczna nie musi tworzyć obiektu podczas wprowadzania do JVM,może być używana bezpośrednio przez jej nazwę klasy
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-03 08:20:50
Jeśli wywodzisz się z środowiska java, pojęcie klasy w Scali jest podobne do Javy, ale klasa w Scali nie może zawierać statycznych członków.
Obiekty w Scali są typu singleton, w którym wywołujesz metody używając nazwy obiektu, w Scali obiekt jest słowem kluczowym, a w Javie obiekt jest instancją klasy
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-04 11:40:38
Class & object: klasa jest definicją, która opisuje wszystkie atrybuty encji lub obiektu. Obiekt jest instancją klasy.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-04 15:16:28