回答:
class C
JavaまたはC ++と同様に、クラスを定義します。object O
いくつかの匿名クラスのインスタンスとしてシングルトンオブジェクトO
を作成します。一部のクラスのインスタンスに関連付けられていない静的メンバーを保持するために使用できます。object O extends T
オブジェクトをO
のインスタンスにしtrait T
ます。その後、O
どこにでも渡すことができますT
。class C
、その後、object C
あるコンパニオンオブジェクトクラスのはC
、コンパニオンオブジェクトは、自動的にはのインスタンスではないことに注意してくださいC
。オブジェクトとクラスについてはScalaのドキュメントも参照してください。
object
静的メンバーのホストとしてほとんどの場合、object
最初にいくつかのクラスのインスタンスをインスタンス化しなくても使用できるメソッドと値/変数を保持する必要があります。この使用法はstatic
、Javaのメンバーと密接に関連しています。
object A {
def twice(i: Int): Int = 2*i
}
次に、を使用して上記のメソッドを呼び出すことができA.twice(2)
ます。
twice
あるクラスのメンバーである場合は、A
最初にインスタンスを作成する必要があります。
class A() {
def twice(i: Int): Int = 2 * i
}
val a = new A()
a.twice(2)
twice
インスタンス固有のデータを必要としないため、これがどれほど冗長であるかを確認できます。
object
特別な名前付きインスタンスとしてobject
自身をクラスまたはトレイトの特別なインスタンスとして使用することもできます。これを行うとき、オブジェクトtrait
は、そのサブクラスのインスタンスになるために、いくつかを拡張する必要があります。
次のコードを検討してください。
object A extends B with C {
...
}
この宣言は、最初の両方を拡張し、匿名(アクセス不可)クラスを宣言B
し、をC
、と名付けられ、このクラスの単一のインスタンスをインスタンス化A
。
この手段は、A
型のオブジェクトを期待関数に渡すことができるB
かC
、またはB with C
。
object
Scalaにはオブジェクトの特別な機能もいくつかあります。公式ドキュメントを読むことをお勧めします。
def apply(...)
通常のメソッド名なしの構文を有効にします A(...)
def unapply(...)
カスタムパターンマッチングエクストラクタを作成できますCommerce
クラスを認識しませんが、JVMとJava言語は認識します。(それobject Foo{ def main(args:Seq[String]) }
がプログラムの実行方法と期待される方法です。)
A class
は定義、説明です。メソッドと他の型の構成の観点から型を定義します。
アンはobject
一意であることが保証されたクラスのインスタンス-シングルトンです。object
コード内のすべてについてobject
、実装を宣言したクラスから継承する匿名クラスが作成されます。このクラスは、Scalaのソースコードからは見ることができません。
との間には関係がobject
ありclass
ます。同じ名前を共有するオブジェクトは、クラスのコンパニオンオブジェクトと呼ばれます。これが発生すると、それぞれがprivate
他方の可視メソッドにアクセスできます。ただし、これらのメソッドは自動的にインポートされません。それらを明示的にインポートするか、クラス/オブジェクト名を前に付ける必要があります。
例えば:
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
}
}
def f(x: X) = ???
メソッドがあるx
とすると、コンパニオンクラスのプライベートメソッドを呼び出すことができX
ます。
多くの人が説明object
したように、シングルトンインスタンスを定義します。ここで私が信じられていない答えの1つは、object
いくつかの目的に役立つことです。
これは、静的メソッドまたは便利なメソッドと見なされるものを含むclass
/のコンパニオンオブジェクトにするtrait
ことができます。
モジュールのように機能し、関連する/補助的なタイプや定義などを含みます。
class
1つまたは複数trait
のを拡張することにより、インターフェースを実装できます。
sealed trait
データを含まないのケースを表すことができます。この点で、case class
パラメーターがない場合よりも正しいと見なされることがよくあります。実装者sealed trait
のみのの特殊なケースは、case object
多かれ少なかれ列挙型のScalaバージョンです。
これは、implicit
主導ロジックの証拠として機能します。
シングルトンタイプを紹介します。
これは非常に強力で一般的な構成です。Scalaの初心者にとって非常に混乱する可能性があるのは、同じ構成が非常に異なる用途を持つ可能性があることです。また、object
これらのさまざまな用途の多くを一度に処理できるため、さらに混乱を招く可能性があります。
正式な違い-
使用法の違い:
object
。関連クラスの有無にかかわらず使用できます。最初のケースでは、コンパニオンオブジェクトと呼ばれます。必ず:
プログラムを作成するにはobject
、ではなくでmainメソッドを使用する必要がありますclass
。
object Hello {
def main(args: Array[String]) {
println("Hello, World!")
}
}
Javaでシングルトンオブジェクトを使用するときにも使用できます。
オブジェクトのキーワードは次のようである新しいシングルトンタイプ、作成したクラスのみ単一の名前付きインスタンスを持っています。Javaに慣れている場合は、オブジェクトを宣言する、Scalaでをは、匿名クラスの新しいインスタンスを作成することとよく似ています。
ScalaにはJavaのstaticキーワードに相当するものはなく、オブジェクトはJavaの静的メンバーを持つクラスを使用する可能性があるScalaでよく使用されます。
Scalaにはstatic
概念はありません。そのため、scalaはシングルトンオブジェクトを作成して、プログラム実行のエントリポイントを提供します。シングルトンオブジェクトを作成しない場合、コードは正常にコンパイルされますが、出力は生成されません。シングルトンオブジェクト内で宣言されたメソッドには、グローバルにアクセスできます。シングルトンオブジェクトは、クラスと特性を拡張できます。
Scalaシングルトンオブジェクトの例
object Singleton{
def main(args:Array[String]){
SingletonObject.hello() // No need to create object.
}
}
object SingletonObject{
def hello(){
println("Hello, This is Singleton Object")
}
}
出力:
Hello, This is Singleton Object
scalaでは、シングルトンオブジェクトと同じ名前のクラスがある場合、それはコンパニオンクラスと呼ばれ、シングルトンオブジェクトはコンパニオンオブジェクトと呼ばれます。
コンパニオンクラスとそのコンパニオンオブジェクトは、両方とも同じソースファイルで定義する必要があります。
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.")
}
}
出力:
Hello, this is Companion Class.
And this is Companion Object.
Scalaでは、クラスには以下を含めることができます。
1.データメンバー
2.メンバー方式
3.コンストラクタブロック
4.ネストされたクラス
5.スーパークラス情報など
クラス内のすべてのインスタンス変数を初期化する必要があります。デフォルトのスコープはありません。アクセススコープを指定しない場合、パブリックになります。mainメソッドが定義されているオブジェクトが必要です。これは、プログラムの開始点を提供します。ここでは、クラスの例を作成しました。
クラスのScalaサンプルの例
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);
}
}
申し訳ありません。手遅れですが、お役に立てば幸いです。
ScalaクラスはJavaクラスと同じですが、Javaのメインメソッドのように、クラスのエントリメソッドを提供しません。オブジェクトキーワードに関連付けられたメインメソッド。objectキーワードは、暗黙的に定義されたクラスのシングルトンオブジェクトを作成することと考えることができます。
詳細については、この記事のクラスとScalaプログラミングのオブジェクトキーワードを確認してください。
クラスは、他の言語の他のクラスと同じです。他の言語と同じようにクラスを定義しますが、構文に違いがあります。
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()
また、注目すべき点は、オブジェクトクラスが遅延して作成されることです。これは、もう1つの重要な点です。したがって、これらは、コードで必要とされない限りインスタンス化されません。
JDBCの接続作成を定義している場合は、シングルトンオブジェクトを使用するJavaの場合と同じように、オブジェクト内に作成して重複を回避できます。