11.Trait(トレイト)

作成中

// http://docs.groovy-lang.org/next/html/documentation/core-traits.html
trait Human {
    String name = "koji"
    public Integer age = 31
    private twitter = "@saba1024"
    public String speak() {
        "I am Human"
    }
    // public、もしくはフィールドを宣言すると、ゲッターとセッターを用意するか、特種な記法でアクセスする必要がある。
    // ただし、アクセサメソッドを実装すると、専用記法(xxx.Human__age)が利用できなくなる。
    public Integer getAge(){
        age
    }
    public String getTwitter() {
        twitter
    }
    
}

class Man implements Human {}

def man = new Man()
assert "I am Human" == man.speak()
assert "koji" == man.name
//assert 31 == man.Human__age // publicを指定すると、普通の方法ではアクセスできなくなる。
assert 31 == man.age // ただし、ゲッターを用意すれば今までどおり。
assert "@saba1024" == man.Human__twitter // privateを指定すると、publicと同様の動作。
assert "@saba1024" == man.twitter // twitterプロパティはprivateだけど、ゲッターを宣言しているのでこれで参照できる。



// 複数のtraitをimplementsして、同名のメソッドがある場合は、implementsの右側が優先される
trait A {String exec() {"A"}}
trait B {String exec(){"B"}}
class C implements A, B {}
def c = new C()
assert "B" == c.exec()