[はじめようApache Groovy] #14 - トレイト

こんにちは!なるーらぼです!前回はオブジェクト指向のプログラミングで避けて通ることのできない継承やインターフェースについてみてきました。もちろん、Groovyではオブジェクト指向でプログラミングしなくても便利なスクリプトを記述することはできます。ですが、今回もオブジェクト指向についてのお話しをしたいと思います。今回はトレイトです。

これはあまり見かけるものでもありませんが、変わった特徴をもつ便利な機能ですのでみていくことにします。


トレイト

トレイトというのは難しくいうと「構造的にオブジェクト指向プログラミングをするためのもの」なんですが、簡単に言うと「プロパティと、デフォルトの実装があるメソッドをもつことができるインターフェース」といったところでしょうか。

再びロボットさんに登場いただいて、トレイトをみていきたいと思います。トレイトはインターフェースの変わり種なので実装するようになります。

trait Speaker {
 String name
 String speech() {

  "コンニチハ"

 }

}

class Robot implements Speaker{

 String bodyColor

 void walk(){

  println "ウィーーーン"

 }

}

def f = new Robot(name: "nalulabo", bodyColor: "green")

println f.speech()

f.walk()

上記のコードを実行してみてください。インターフェースのように「Speaker」トレイトを実装したロボットさんは、「speech」メソッドの記述がありません。しかし、メソッド呼び出しすることができています。また、プロパティにnameはありませんが、コンストラクタとして値をセットすることもできています。

これはそれぞれトレイトに定義があるからです。

トレイトがインターフェースと異なる点として、デフォルトの実装があることのほかにも違いがあります。例えばインターフェースのような実装のないメソッドは抽象メソッドとして「abstract」をつける必要があります。それに、privateアクセス修飾子をつけたメソッドも利用することができます。

trait Speaker {
 String name
 String speech() {

  message()

 }

 private String message() {

  "コンニチハ"

 }

 abstract void walk()

}

class Robot implements Speaker{

 String bodyColor

 void walk(){

  println "ウィーーーン"

 }

}

def f = new Robot(name: "nalulabo", bodyColor: "green")

println f.speech()

f.walk()

なお、クラスではthisキーワードが指すものはオブジェクトになりますが、トレイトではそのトレイトを実装したクラスになります。

さらに、トレイトはインターフェースを実装することもできます。


振る舞いを合成する

トレイトの最大の魅力は振る舞いを合成する機能でしょう。振る舞いって・・・メソッドのことですよ!

Groovyではトレイトを複数実装することができます。つまり、2つ以上の機能を同時にクラスに導入することができます。

ではロボットさんに再び登場いただいて、「話す」機能のトレイトと「歩く」機能のトレイトをそれぞれロボットクラスへ導入してみます。

trait Speaker {
 String speech() {
  "コンニチハ"

 }

}

trait Walker {

 void walk(){

  println "ウィーーーン"

 }

}

class Robot implements Speaker, Walker {}

def f = new Robot()

println f.speech()

f.walk()

ご覧ください!とうとうプロパティを削ったらロボットさんはトレイトを実装するよという宣言のみになってしまいました。それでも実体化すると話すし歩きます!!

もちろんトレイトで実装されたデフォルト実装をクラスで上書きすることもできます。

trait Speaker {
 String speech() {
  "コンニチハ"

 }

}

trait Walker {

 void walk(){

  println "ウィーーーン"

 }

}

class Robot implements Speaker, Walker {

 String speech() {

  "やあ、こんにちは!"

 }

}

def f = new Robot()

println f.speech()

f.walk()

speechメソッドの実装がなされたので、少し気持ち悪い挨拶をしてくれるようになりました。

なお、トレイトはトレイトを継承することもできます。また、2つ以上のトレイトを継承したトレイトをつくることもできますので、小さくつくって合成していくということも簡単に行うことができます。


最後に

今回はトレイトをみていきました。かなりパワフルな機能だと思いますので、便利に使うようにしましょう。

次回はクロージャをみていきます。

もんが(なるーらぼ)

個人でプログラミングの学習サイト「なるーらぼ」を運営しています。
https://nalu-labo.amebaownd.com
PowerShell入門の電子書籍2冊も出版しています。
http://www.amazon.co.jp/dp/B017LJOCJ2

なるーらぼ

ごく自然にプログラミングを楽しむことができる世界をつくるお手伝いをしています

0コメント

  • 1000 / 1000