Scalaトレイト

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

以下のチュートリアルに興味を持つかもしれません:

はじめに

Traitは、オブジェクト指向プログラミングで主要に使用される概念で、メソッドの集合を使用してクラスの機能を拡張することができます。

トレイトは Java プログラミング言語のインターフェースと精神上に似ています。クラスとは異なるため、Scalaのトレイトはインスタンス化できず、引数やパラメーターも持ちません。しかし、クラスやオブジェクトで継承(拡張)することができます。それは、トレイトは特定のメソッド/関数の集合を提供し、それらのメソッドが提供された振る舞いをパラメーター化することを期待するクラスに対する振る舞いを実行します。

オブジェクトを定義するために使用されるトレイトは、異なるクラスが複数の継承を必要とせずに使用できるメソッドのミックスとして作成されます。しかし、2つのトレイトが同じ名前のメソッドを持っている(名前の衝突)場合もあり、その場合は、クラスが明示的に解決しなければなりません。

トレイトは抽象的非抽象的の両方のメソッド、フィールドをメンバーとして持てます。トレイト内でメソッドを初期化しない場合、それらは抽象的です。初期化されたものは非抽象的と呼ばれます。抽象的なメソッドでは、トレイトを実装するクラスが初期化を行います。

では、いくつかの例を通じて Scalaのトレイトを素早く理解しましょう!

Scala トレイトの構文

Scalaトレイトの構文は単純で、traitキーワードにトレイトの名前を続けます。

trait Trait_Name{ // 変数 // メソッド }

上記の特性定義からわかるように、DataCampという名前の特性が定義されていますが、その中には変数やメソッドが定義されていません。

Scalaの特性の簡単な例に進みましょう。これにより、プログラム上での動作がより明確になります。

紹介で述べたように、Scalaの特性はextendsキーワードを使用してクラスによって継承されます。

class Scala_Tutorial extends DataCamp{ // 変数 // メソッド }

Scala_Courseという名前の特性を定義し、それをクラスDataCampが継承するようにします。traitの中で、抽象メソッドであるscala()を定義し、それをDataCampクラス内で定義します。

trait Scala_Course{ def scala() } class DataCamp extends Scala_Course{ def scala(){ println("DataCamp has recently launched there first Scala course") } } object Main{ def main(args:Array[String]){ var a = new DataCamp() a.scala() } }

では、上記のコードを実行してみましょう。

上記の例では、scala()メソッドは抽象メソッドであったため、その特性を継承したクラス内で宣言が行われました。

しかし、特性内ですでに実装されているメソッド(非抽象メソッド)がある場合はどうでしょうか?その場合、この特性を拡張するクラスは、特性内ですでに実装されているメソッドを実装する必要はありません。

小さな例を使ってこれを理解しましょう。

trait BMW{ // トレイト変数 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); } } class Car extends BMW{ // クラス変数 var make1: String = "Mercedes Benz" var model1: String = "S350D" var fuel1: Int = 50 // クラスメソッド def Merc_Specs() { println("Make of the Car : " + make1); println("Model of the Car : " + model1); println("Fuel capacity of the Car : " + fuel1); } } object Main { // メインメソッド def main(args: Array[String]) { // クラスオブジェクト var obj = new Car(); println("Calling the Class Method") obj.Merc_Specs(); println("Calling the Trait Method") obj.Display(); } }

上記のコードを実行してみましょう:

抽象的abstractと非抽象的non-abstractメソッドの違いを理解したら、継承または拡張するクラスでabstractメソッドを実装しなかった場合に何が起こるかを見てみましょう。

この概念を理解するために、同じ例を使用してみましょう。

trait Scala_Course{ def scala() } class DataCamp extends Scala_Course{ def print(){ println("Error: Class DataCamp needs to be Abstract") } } object Main{ def main(args:Array[String]){ var a = new DataCamp() a.print() } }

上記のコードを実行すると、以下のようにエラーが発生します。なぜなら、継承したクラスで抽象メソッドscala()を定義していないからです。

上記のコードを動作させるためには、2つの解決策があります:

  • DataCampクラスでscala()メソッドを定義するか、
  • DataCampクラスをabstractとして定義する。

今日のチュートリアルの最後のトピックは、1つのクラスで複数のトレイトを継承する方法です。では、それを素早く終わらせましょう。

trait A{ // メソッド } trait B{ // メソッド } class C extends A with B{ }
trait BMW{ var make: String = "BMW" var model: String = "X7" var fuel: Int = 40 } trait Merc{ var make1: String = "Mercedes Benz" var model1: String = "S350D" var fuel1: Int = 50 } class Car extends BMW with Merc{ def BMW_Specs() { println("Make of the Car : " + make); println("Model of the Car : " + model); println("Fuel capacity of the Car : " + fuel); } def Merc_Specs() { println("Make of the Car : " + make1); println("Model of the Car : " + model1); println("Fuel capacity of the Car : " + fuel1); } } object Main { // メインメソッド def main(args: Array[String]) { // クラスオブジェクト var obj = new Car(); println("Calling the BMW Trait") obj.BMW_Specs(); println(); println("Calling the Merc Trait") obj.Merc_Specs(); } }

最後に、上記のコードを実行してみましょう。

おめでとうございます!

このチュートリアルを完了していただき、

スcalaでプログラミングにおけるTraitとその使用方法を学びました。おすすめの練習として、

継承したクラスで宣言されていない抽象的なメソッドの解決策を探るのはとても効果的です。同様のコードを書いて、コンパイルエラーがないか確認してみてください。小さなヒントですが、

Scalaの抽象的なクラスについての情報を参照することがお役に立てれば幸いです。このチュートリアルに関する質問は、下のコメント欄でお聞きください。最後に、DataCampで新しいScalaコースIntroduction to Scalaを受講するようにお願いいたします。

Source:
https://www.datacamp.com/tutorial/scala-traits