Scalaのクラスとオブジェクト

DataCampは最近、初めてのScalaコースを立ち上げました。Scalaの入門をご確認ください!

また、以下のチュートリアルもご確認ください。

はじめに

Source

一般的に、オブジェクト指向プログラミング(OOP)はクラスとオブジェクトを含んでおり、多态性や継承を実装する実際の世界のエンティティを实现することを目的としています。

OOPは開発を大幅に速くし、より安上がることができ、ソフトウェアの持続性を向上させます。この魔法の主な理由は、サポートされている機能の数にあります。クラスとオブジェクトがあり、将来的に要求に基づいて再利用できることができます。これは、クラスとオブジェクトを欠くプログラムと比較して、高い品質のソフトウェアを開発できることになります。これにより、新しいメソッドや属性として拡張性が得られます。

車のショールームがあると仮定します。数ヶ月おきに新しい車が発売され、その名前と特徴を聴衆に知らしめるために、新しいメソッドや属性を從零開始で定義する必要があります。しかし、もしオブジェクト指向プログラムがあり、その中に「車」のクラスがあるとしたら、新車用のオブジェクトを追加するだけでよく、それは車の情報を持ってクラスのメソッドと属性を呼び出します。

クラスはオブジェクトの表現や設計として考えることができます。通常、クラスは自身のメソッド(行動)と属性を持っています。

属性は、各オブジェクトを他のものと区別する個別のエンティティで、オブジェクトの様々な性質を決定します。一方、メソッドはプログラミングで通常の関数のような働きをします。それらはクラスのインスタンスがどのように動作するかを決定します。それは主にメソッド(行動)のために、オブジェクトは何かを行う力を持っています。

Source

上の図は、オブジェクト指向プログラミングの流れや、より具体的にはクラスがどのようなものかを直感的に提供します。上の画像には、class carがあり、属性:燃料、最大速度を持ち、モデルメーカーなどのさらなる属性を持つことができます。それはrefuel()getFuel()setSpeed()などの異なる一連のメソッドを持ち、追加のメソッドはギア変更エンジン起動エンジン停止などできます。

したがって、特定の車について話す場合、クラスのインスタンス化されたオブジェクトを持つことになります。

Scalaのオブジェクト指向プログラミングについて語りましょう。

Scalaのクラスとオブジェクト

C++やJavaと同様に、Scalaのオブジェクト指向プログラミングは同じ慣習に従います。それにはクラスオブジェクトの定義の概念があり、クラスのコンストラクタ内にあります。これがScalaのオブジェクト指向プログラミングのすべてです。

クラス宣言

class Class_name{ // メソッドと属性 }

Scalaでは、classキーワードに続いてクラス名を指定してクラスを定義します。一般的に、クラス名は大文字で始まります。オプションのキーワードがいくつかありますが、Scalaのクラス宣言で使用できます。例えば、クラス名は大文字で始まるべきです。また、スーパークラスextendキーワードに続いて指定し、トレイトはカンマ区切りの一覧で、クラスが実装するもので、extendキーワードに続くものです。

Scalaのクラスは1つの親クラスを継承することしかできず、つまりScalaは多重継承をサポートしていません。しかし、トレイトを使用することで実現できます。

最後に、Scalaのクラスの本体は波括弧{}で囲まれます。

// クラス名はCarです class Car { // クラス変数 var make: String = "BMW" var model: String = "X7" var fuel: Int = 40 // クラスメソッド def Display() { println("Make of the Car : " + make); println("Model of the Car : " + model); println("Fuel capacity of the Car : " + fuel); } } object Main { // メインメソッド def main(args: Array[String]) { // クラスオブジェクト var obj = new Car(); obj.Display(); } }

あなたは上記のコードをclass.scalaという名前で保存し、scala class.scalaとして端末で実行することができます。以下のような出力を見ることができます。

上記のコードは、オブジェクト指向プログラムが持つ特権を完全に活用していません。上記のコードの出力は、何回実行しても同じ結果を返します。クラス内に静的変数を定義し、これらの変数の値は、无限に新しいオブジェクトを作成しても変わりません。結論として、メルセデス・ベンツやフェラーリの車の詳細を期待することはできません。

Scalaのコンストラクタ

コンストラクタは主にオブジェクトの状態を初期化するために使用されます。このオブジェクトの初期化は、オブジェクト作成時に行われ、一度だけ呼び出されます。

Scalaには2種類のコンストラクタがあります:プライマリ補助的。このチュートリアルでは、プライマリコンストラクタについて学びます(ソース:O’Reilly)。

class Class_name(Parameter_list){ // メソッド、属性 }

プライマリコンストラクタは、クラス定義と同じ本体を持ち、クラス定義と共に暗黙的に作成されます。それはクラス定義で始まり、クラスの本体全体を含みます。また、Scalaプログラムに1つのコンストラクタしかない場合、それはプライマリコンストラクタとして知られます。プライマリコンストラクタは、0個、1個、または複数のパラメーターで定義することができます。

ですので、前の例を使いますが、これ回は主要なコンストラクター機能を追加してみて、影響を観察してください。

また、ここでクラスの新しい機能を学びます。すなわち、クラスは複数のオブジェクトやインスタンスを持つことができ、しかし、それらは互いに独立しています。

// クラスの名前は Car class Car(make: String, model: String, fuel: Int) { // クラスメソッド def Display() { println("Make of the Car : " + make); println("Model of the Car : " + model); println("Fuel capacity of the Car : " + fuel); } } object Main { // メインメソッド def main(args: Array[String]) { // 複数のクラスオブジェクト var obj1 = new Car("BMW", "X7", 40); var obj2 = new Car("Mercedes Benz", "S350D", 50); obj1.Display(); obj2.Display(); } }

迅速に出力を見てください。

これは素晴らしいですね。コンストラクターの助けを借りて、より効果的な結果を生成することができました。

Scalaでのオブジェクト宣言

Scalaでのオブジェクト宣言は、クラスをインスタンス化することや、クラスを呼び出すこととも言えます。クラスと同様に、オブジェクトもオブジェクト指向プログラミングの基本単位です。

オブジェクトは3つの機能を持つことができます。(情報源: GeeksforGeeks):

  • 状態: オブジェクトの属性はそれを表現します。また、オブジェクトの属性を反映します。
  • 行動: オブジェクトのメソッドはそれを表現します。また、オブジェクトが他のオブジェクトとの対話を反映します。
  • 識別子: オブジェクトに唯一の名前を与えます。それにより、1つのオブジェクトが他のオブジェクトとのやり取りを可能にします。

オブジェクトとして犬を考えて、以下の図を参照してそのID、状態、ビヘイビアを確認してください。

(Source)

全てのインスタンスやオブジェクトはクラスの属性とメソッドを共有します。一度に複数のオブジェクトを持つことができる単一のクラスがあります。ここで学んだように。しかし、各オブジェクトの状態や値はユニークです。

最後に、主要なコンストラクタ、クラス変数、属性、メソッドが一つのコードに統合されたコードを書きます。

以下は、クラスMotorcycleにまとめたコンポーネントの図解です。

以下のコードは非常に自明です。しかし、高レベルでは、モーターサイクルのエンジンがonまたはoffの状態かを確認しています。最初に、エンジンはオフ状態になり、その状態を通知し、オンに切り替えます。

class Motorcycle(make:String,color:String) { var engineState: Boolean = false; def startEngine() { if (engineState == true){ println("The engine is already on."); } else { engineState = true println("The engine is now on."); } } def showAtts() { println("This motorcycle is a "+ color + " " + make); if (engineState == true){ println("The engine is on."); } else{ println("The engine is off."); } } } object Main { def main (args: Array[String]) { var m = new Motorcycle("BMW K 1600 GTL","White"); println("Calling showAtts..."); m.showAtts(); println("------"); println("Starting engine..."); m.startEngine(); println("------"); println("Calling showAtts..."); m.showAtts(); println("------"); println("Starting engine..."); m.startEngine(); } }

おめでとうございます!

このチュートリアルを完了したことにおめでとうございます。

Scalaでのクラスとメソッドの宣言、オブジェクトのインスタンス化、属性の設定、インスタンスメソッドの呼び出しを知ることができました。これらの概念は、Scalaだけでなく、他のプログラミング言語でも役立ちます。

オブジェクト指向プログラミングの概念は、興味深く且つ非常に強力です。これにより、コードに新たな次元を追加し、再利用性を高めます。プログラムがより大きくなるにつれて、コードの複雑さが増加します。オブジェクト指向プログラミングのコンセプトには、継承、多态性、インスタンスメソッドなどが含まれ、非常に丰かです。もう一つ強力な特性は、シングルトンです。設計原則は、コードをより構造化し、可読性を向上させます。設計パターンに関する情報を読むにはこの本を参照してください。

このトutorialに関する質問は、下のコメント栏でお聞きください。

最後に、DataCampで新しいScalaコースScalaの入门を取るように思い出してください。

Source:
https://www.datacamp.com/tutorial/scala-classes-objects