2009年12月15日火曜日

[Scala] Trait って何者 (2)

[Scala] Trait って何者 (1)の続きです。

Trait は Class を継承することもできます。継承のパターンを変えて、コンパイルしたときにできるクラスファイルをみてみました。

<前回観察したこと>
  • Trait をコンパイルすると必ずクラスファイルが一つ TraitName.class (逆アセンブルするとインタフェース) できる。
  • 具象メソッドをもつ Trait の場合はさらに TraitName$class.class (逆アセンブルするとアブストラクトクラス) ができる。


// Sample 1 (前回と同じ)

trait Animal

trait HasLegs extends Animal {
def legs: Int
}

trait HasFourLegs extends HasLegs {
def legs: Int = 4
}



コンパイルしてできるクラスファイルは以下。
- Animal.class // javapするとinterface
- HasLegs.class // javapするとinterface
- HasFourLegs.class // javapするとinterface
- HasFourLegs$class.class // javapすると abstract class

具象メソッドをもつ HasFourLegs Trait のみ、アブストラクトクラスが生成されます。

// Sample 2

abstract class Animal

trait HasLegs extends Animal {
def legs: Int
}

trait HasFourLegs extends HasLegs {
def legs: Int = 4
}



コンパイルしてできるクラスファイルは以下。
- Animal.class // javapすると abstract class
- HasLegs.class // javapすると interface
- HasFourLegs.class // javapすると interface
- HasFourLegs$class.class // javapすると abstract class

アブストラクトクラスが生成されるのは Sample 1 と同じく HasFourLegs のみ。HasLegs は Animalクラスを継承していますが生成されるのはインタフェースのみです。

// Sample 3

abstract class Animal

abstract class HasLegs extends Animal {
def legs: Int
}

class HasFourLegs extends HasLegs {
def legs: Int = 4
}

trait Mammal extends HasFourLegs



コンパイルしてできるクラスファイルは以下。
- Animal.class // javapすると abstract class
- HasLegs.class // javapすると abstract class
- HasFourLegs.class // javapすると class
- Mammal.class // javapすると interface

具象メソッドをもつクラスを継承している Mammal Trait ですが、.class しか生成されません。

どのような親をもつにせよ、Trait 自身が具象メソッドをもつ場合に限り、TraitName$class.class (中身はアブストラクトクラス) が生成されるようです。

0 件のコメント:

コメントを投稿