scala学習-trait学習

2254 ワード

trait scala          。             ,              。
  trait   :

trait ConsoleLogger{ def logger(msg: String) = {println(msg)} }
  • クラスの継承とは異なり、1つのサブクラスは一意のスーパークラスからのみ継承され、1つのクラスに複数の特質が混入することができる.特質の定義とクラス定義はキーワードが異なる以外はほとんど差がない.特質も同じタイプですが、特質と類には違いがあります.クラスパラメータ、すなわちクラスに渡されるプライマリコンストラクタのパラメータは使用できません.2.クラスでは、superの呼び出しは静的にバインドされ、traitでsuperを呼び出すのは動的にバインドされます.たとえば、抽象クラスを定義します.
  • abstract class IntQueue {
      def get(): Int
      def put(x: Int)
    }

    もう1つのクラスがIntQueueクラスから継承されることを定義し、この抽象クラスの抽象メソッドgetとputを実現し、プライベートフィールドbufを作成します.
    class BasicIntQueue extends IntQueue{
        private val buf = new ArrayBuffer[Int]
        def get() = buf.remove(0)
        def put(x: Int) { buf += x}
    }

    IntQueueから継承されたtraitを定義し、スーパークラスのputメソッドを複写します.
    trait Doubling extends IntQueue {
        abstract override def put(x: Int) { super.put(x * 2)}
    }

    上記のtraitで呼び出されたsuperは動的にバインドされています.次のクラスを定義すると
    class MyQueue extends BasicIntQueue with Doubling

    このときDoublingという特質が混入した後,このときのsuperバインドのBasicIntQueueのputメソッド.