2016-10-26 32 views
2

私はScalaとAkkaを学んでいます。私は私を混乱させる例を見つけました。次のコードサンプルは1つのファイルにあります。特色の範囲

class RestApi(system: ActorSystem, timeout: Timeout) extends RestRoutes { 
    implicit val requestTimeout = timeout 
    implicit def executionContext = system.dispatcher 

    def createBoxOffice = system.actorOf(BoxOffice.props, BoxOffice.name) 
} 

trait BoxOfficeApi { 
    import BoxOffice._ 

    def createBoxOffice(): ActorRef 

    implicit def executionContext: ExecutionContext 
    implicit def requestTimeout: Timeout 

    lazy val boxOffice = createBoxOffice() 

    // Uninteresting methods here 
} 

私を混乱させる部分がBoxOfficeAPIトレイトでcreateBoxOffice()呼び出しです。 BoxOfficeAPIにはActorRefを返す関数があることが明確に記載されています。しかし、その機能の実装は、特性への参照を持たないRestApiクラスにあります。

形質がこの方法にどのようにアクセスすることが可能でしょうか?形質の範囲は何ですか?

答えて

4

形質がこの方法にどのようにアクセスできるか?

私はあなたの特性自体がcreateBoxOfficeという抽象メソッドがあるという事実に欠けていると思う:

def createBoxOffice(): ActorRef 

それはスコープのような方法を持っている理由です。それはRestApiの宣言とは関係ありません。誰がこの特性を混ぜるかは、その方法を実装する必要があります。これは、例えば、RestApiクラスがBoxOfficeApiに混在することを決定した場合、それは既に使用可能な実装が利用可能であることを意味します。例:

class Baz extends Foo { 
    override def quuux(): Unit = println("quuux") 
} 

trait Foo { 
    def quuux(): Unit 
} 
+0

あなたは完全に正しいです。私はまたコードサンプルの中で 'RestRoutes'という別の特性を除外しました。この特性は 'BoxOfficeApi'を' RestApi'に結合しました。ここで定義されているメソッドの実装にどのように到達するのです。 これを指摘してくれてありがとう! – RemcoW

+0

@RemcoWよろしくお願いします。 –

+0

でも、別の質問が出てきました。関数 'quuux()'が 'Foo'特性からオーバーライドされていることを定義するには、' override'キーワードを使用しています。これは、私が掲示した例では使用されていません。これはオプションのキーワードですか? – RemcoW