2010-05-11 33 views

Trả lời

3

Làm thế nào về một lai của các câu trả lời khác

abstract trait A //interested in this one 
trait B extends A //and this one 
trait C extends A //this one too 
trait D //don't care about this one though 

val x = new A with B with D 
x.getClass.getInterfaces.filter(classOf[A].isAssignableFrom(_)) 

lợi nhuận

Array[java.lang.Class[_]] = Array(interface A, interface B) 
1
scala> val x = new A with B with C 
x: java.lang.Object with A with B with C = [email protected] 

scala> x.getClass.getInterfaces 
res11: Array[java.lang.Class[_]] = Array(interface A, interface B, interface C) 
+0

Tôi đã nghĩ về phương pháp hiển nhiên này nhưng quyết định hỏi ở đây vì những đặc điểm như tôi biết có thể biên dịch một cách tinh vi. – Jeriho

+0

Không bao giờ sử dụng sự phản chiếu khi ngôn ngữ có đủ điều kiện. –

+0

Đồng ý. Lần đầu tiên tôi sử dụng isInstanceOf - câu trả lời cho câu hỏi của anh ấy. Nhưng tôi đã chuyển sang getInterfaces khi tôi đọc lại tiêu đề câu hỏi thực tế của mình "Cách lấy danh sách các đặc điểm ...". –

1

Làm thế nào về một cái gì đó như thế này:

def getTraitsExtending(clazz:Class[_], baseTrait:Class[_]): Seq[Class[_]] = { 
    clazz.getInterfaces().filter { baseTrait isAssignableFrom _ } 
} 

này tìm tất cả các đặc điểm mà clazz cụ mà mình subtraits của baseTrait. Với những đặc điểm sau đây:

trait A 
trait B extends A 
trait C extends A 
trait D 

Sử dụng như sau:

scala> val x1 = new C with B 
x1: java.lang.Object with C with B = [email protected] 

scala> getTraitsExtending(x1.getClass, classOf[A]) 
res0: Seq[Class[_]] = WrappedArray(interface C, interface B) 

scala> val x2 = new C with A    
x2: java.lang.Object with C with A = [email protected] 

scala> getTraitsExtending(x2.getClass, classOf[A]) 
res1: Seq[Class[_]] = WrappedArray(interface C, interface A) 

scala> val x3 = new C with D    
x3: java.lang.Object with C with D = [email protected] 

scala> getTraitsExtending(x3.getClass, classOf[A]) 
res3: Seq[Class[_]] = WrappedArray(interface C) 

này chỉ nhìn vào giao diện được các thực hiện trực tiếp bởi lớp của các trường hợp được thông qua năm, nhưng có thể được mở rộng để đệ quy tìm kiếm lên hệ thống phân cấp thừa kế.

+0

Điều này trông rất khủng khiếp như câu trả lời của tôi + một chút về bản mẫu :) –

+0

@Kevin - dấu ngày cho biết câu trả lời của bạn trông khủng khiếp rất nhiều như câu trả lời của tôi ... :-P –

+0

Đó không phải là những gì tôi thấy khi tôi đặt hàng bởi "mới nhất" :) –

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