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?

Author: Michal Kordas, 2009-11-18

13 answers

Tl;dr

  • class C definiuje klasę, tak jak w Javie lub c++.
  • object O tworzy obiekt singleton O 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 obiekt O jest instancją trait T; można następnie przekazać O w dowolnym miejscu, oczekuje się T.
  • jeśli istnieje class C, to object Cjest obiektem towarzyszącym klasy C; 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 metody A(...)
  • 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ę]}
 472
Author: ziggystar,
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
   }
}
 233
Author: Daniel C. Sobral,
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.

 63
Author: Thomas Jung,
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ęcej trait 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 przypadkiem sealed trait z implementatorami case 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.

 16
Author: acjay,
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).

 14
Author: Ken Bloom,
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 -

  1. nie można podać parametrów konstruktora
  2. 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:
    1. użycie ta sama nazwa zarówno dla klasy jak i obiektu
    2. umieść je w tym samym pliku źródłowym.
  • Aby utworzyć program należy użyć głównej metody w object, a nie class.

    object Hello {
      def main(args: Array[String]) {
        println("Hello, World!")
      }
    }
    
  • Można go również używać jako obiekt singleton w Javie.

      
        
      

 12
Author: irudyak,
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.

 4
Author: Amine Sagaama,
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().

 2
Author: Yonggoo Noh,
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

 1
Author: FOD,
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.
 1
Author: Bhaskar Das,
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

 0
Author: David,
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

 0
Author: Vivek,
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.

 -22
Author: ABHAY PRATAP SINGH,
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