2013-12-17 19 views
5

Trong Scala chúng tôi sử dụng kết hợp trong như thế này:Có phải loại "A có B" không?

class C extends A with B 

Tôi hiểu lời tuyên bố này như C là một lớp con của A with B. Điều này có đúng không? Hoặc C chỉ là lớp con của cả hai AB (Tôi không nghĩ rằng nó có thể trên JVM không hỗ trợ đa thừa kế)?

Nếu A with B là loại, tại sao dòng này không hoạt động?

classOf[A with B] 

Một lý do tại sao tôi xem xét A with B một loại là một thực tế rằng nó có thể được sử dụng trong mô hình phù hợp:

val c = new C 
val u = c match { case a: A with B => 1 } // 1 

Trả lời

4

Scala hỗ trợ đa kế thừa qua đặc điểm. Bất kỳ lớp nào cũng có thể mở rộng lớp 0 hoặc 1, nhưng cũng có thể "kết hợp" bất kỳ số lượng đặc điểm nào. (Có một chút của trình biên dịch kỳ diệu mà sắp xếp lại mọi thứ đằng sau hậu trường để phù hợp với những hạn chế của JVM) Cú pháp là dọc theo dòng của

class MyClass extends [ClassOrTrait] with [Trait] with [AnotherTrait] with ... 

Vì vậy, định nghĩa C lớp học của bạn là giống như

class ((C extends A) with B) hơn như class (C extends (A with B))

A with B là một loại, và có thể được sử dụng như một loại bí danh, nhưng phương pháp classOf muốn một lớp:

scala> type AB = A with B 
defined type alias AB 

scala> classOf[AB] 
<console>:11: error: class type required but A with B found 
       classOf[AB] 
        ^

vs

scala> class AB extends A with B 
defined class AB 

scala> classOf[AB] 
res12: Class[AB] = class AB 
0

Tôi đồng ý với @Dylan. A with B chỉ là định nghĩa loại. Tuy nhiên, để nó hoạt động với classOf[T], cần phải có giao diện Java hoặc do Scala tạo.

scala> trait A 
defined trait A 

scala> trait B 
defined trait B 

scala> trait AB extends A with B 
defined trait AB 

scala> class C extends A with B 
defined class C 

scala> type TypeAB = A with B 
defined type alias TypeAB 

scala> println(classOf[A]) 
interface $line3.$read$$iw$$iw$A 

scala> println(classOf[B]) 
interface $line4.$read$$iw$$iw$B 

scala> println(classOf[AB]) 
interface $line5.$read$$iw$$iw$AB 

scala> println(classOf[C]) 
class $line6.$read$$iw$$iw$C 

scala> println(TypeAB) 
<console>:8: error: not found: value TypeAB 
       println(TypeAB) 
         ^

scala> classOf[TypeAB] 
<console>:11: error: class type required but A with B found 
       classOf[TypeAB] 

Ngoài ra nó là thú vị mà Scala không quản lý để phù hợp với with trong trường hợp xây dựng.

Các vấn đề liên quan