Разница между объектом и классом в Scala

Изменения в пользовательском интерфейсе могут выполняться с помощью методов Control.Invoke (), это исключение перекрестного потока может быть разрешено с использованием фрагмента кода.

void UpdateWorker()
{
   //Here ddUser is the user control
   //Action to be performed should be called within { } as like below code
   if (this.ddUser.InvokeRequired)
      ddUser.Invoke(new MethodInvoker(() => { ddUser.Size = new Size(100, 100); }));
}
579
задан Michal Kordas 19 May 2015 в 08:48
поделиться

5 ответов

tl;dr

  • class C defines a class, just as in Java or C++.
  • object O creates a singleton object O as instance of some anonymous class; it can be used to hold static members that are not associated with instances of some class.
  • object O extends T makes the object O an instance of trait T; you can then pass O anywhere, a T is expected.
  • if there is a class C, then object C is the companion object of class C; note that the companion object is not automatically an instance of C.

Also see Scala documentation for object and class.

Usage as host of static members

Most often, you need an object to hold methods and values/variables that shall be available without having to first instantiate an instance of some class. Это использование тесно связано с статическими членами в Java.

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

Вы можете затем вызвать вышеуказанный метод, используя A.twice (2) .

If дважды ] были членом некоторого класса A , тогда вам нужно сначала создать экземпляр:

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

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

Вы можете видеть, насколько это избыточно, поскольку дважды не требует никакого экземпляра - конкретные данные.

Использование как особый именованный экземпляр

Вы также можете использовать сам объект как некоторый специальный экземпляр класса или признака. Когда вы делаете это, ваш объект должен расширить некоторую черту , чтобы стать экземпляром его подкласса.

Рассмотрим следующий код:

object A extends B with C {
  ...
}

Это объявление сначала объявляет анонимный (недоступный) класс, который расширяет как B , так и C , и создает один экземпляр этого класса с именем A .

Это означает, что A может передаваться функциям, ожидающим объекты типа B или C , или B с C .

Дополнительные возможности объекта

Там также Есть некоторые особенности объектов в Scala. I recommend to read the official documentation.

  • def apply(...) enables the usual method name-less syntax of A(...)
  • def unapply(...) allows to create custom pattern matching extractors
  • if accompanying a class of the same name, the object assumes a special role when resolving implicit parameters
547
ответ дан 22 November 2019 в 22:00
поделиться

Класс точно так же, как любой другой класс на других языках. Вы определяете класс точно так же, как любой другой язык с некоторым различием в синтаксисе.

class Person(val name: String)
val me = new Person("My name")

Однако объект является классом с отдельным объектом только. Это делает это интересным, поскольку это может использоваться для создания статических членов класса с помощью сопутствующий объект . Этот сопутствующий объект имеет доступ к членам парламента, не занимающим официального поста определения класса, и это имеет то же имя как класс, который Вы определяете.

class Person(var name: String) {

  import Person._

  def hi(): String = sayHello(name)
}

object Person {
  private def sayHello(name: String): String = "Hello " + name
}

val me = new Person("My name")
me.hi()

кроме того, примечательная точка - то, что класс объекта лениво создается, который является другим важным моментом. Так, они не инстанцируют, если они не необходимы в нашем коде.

при определении создания соединения для JDBC можно создать их в объекте избежать дублирования точно так же, как мы делаем в Java с одноэлементными объектами.

0
ответ дан 22 November 2019 в 22:00
поделиться

Класс - это определение, описание. Он определяет тип с точки зрения методов и состава других типов.

Объект является синглтоном - экземпляром класса, который гарантированно уникален. Для каждого объекта в коде создается анонимный класс, который наследуется от тех классов, которые вы объявили объект для реализации. Этот класс нельзя увидеть из исходного кода Scala, хотя вы можете получить его через отражение.

Существует связь между объектом и классом . Объект считается сопутствующим объектом класса, если они имеют одно и то же имя. Когда это происходит, каждый из них имеет доступ к методам частной видимости в другом. Однако эти методы не импортируются автоматически. Вы должны либо импортировать их явно, либо добавить к ним имя класса / объекта.

Например:

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
   }
}
243
ответ дан 22 November 2019 в 22:00
поделиться

Объект имеет ровно один экземпляр (вы не можете вызвать новый MyObject ). У вас может быть несколько экземпляров класса.

Объект служит тем же (и некоторым дополнительным) целям , что и статические методы и поля в Java.

70
ответ дан 22 November 2019 в 22:00
поделиться

Определение объекта в Scala похоже на определение класса в Java, который имеет только статические методы. Однако в Scala объект может расширять другой суперкласс, реализовывать интерфейсы и передаваться, как если бы он был экземпляром класса. (Так что это похоже на статические методы класса, но лучше).

17
ответ дан 22 November 2019 в 22:00
поделиться