2015-03-27 12 views
6

Có thể hạn chế các loại có thể thực hiện một đặc điểm không? Nói, ví dụ tôi có một loạiHạn chế các loại có thể thực hiện Trait

interface Something { 
    void foo() 
} 

và một đặc điểm

trait SomethingAbility { 
    void bar() { 
    println "bar" 
    } 
} 

Có cách nào mà tôi chỉ có thể cho phép các đặc điểm được thực hiện bởi các lớp học mà là của loại Something, ví dụ

// OK 
class SomethingImpl implements Something, SomethingAbility { 
    void foo() { 
    println "foo" 
    } 
} 

// error: this class should not be allowed to implement the trait 
// because it's not a Something 
class NotSomething implements SomethingAbility { 
    void foo() { 
    println "foo" 
    } 
} 

Một lựa chọn là để thêm một phương pháp trừu tượng đến đặc điểm

trait SomethingAbility { 
    void bar() { 
    println "bar" 
    } 

    abstract void foo() 
} 

Điều này sẽ có nghĩa là đặc điểm không thể được thực hiện bởi một lớp trừ lớp mà còn cung cấp một phương pháp foo(), nhưng điều này không phải là điều tương tự như lớp phúc lợi của loại Something

+0

làm cho 'SomethingAbility' triển khai' Something '? – cfrick

+0

@cfrick no ..... Tôi muốn chắc chắn rằng tôi có thể gọi phương thức 'Something' từ' SomethingAbility', nhưng bản thân 'SomethingAbility' không cần phải là' Cái gì đó ' –

+0

nếu quacks giống như một con vịt .. ; P nhưng nó nghĩ rằng ví dụ cuối cùng của bạn và câu cuối cùng nên được về trừu tượng 'foo' và không' bar'? – cfrick

Trả lời

9

tôi nghĩ rằng những gì bạn đang tìm kiếm là @Selftype, xem http://docs.groovy-lang.org/docs/latest/html/gapi/groovy/transform/SelfType.html về cơ bản nó nói những gì một lớp sử dụng đặc điểm này để có impleme nt. Vì vậy, với

@SelfType(Something) 
trait SomethingAbility { 
    void bar() { 
    println "bar" 
    } 
} 

bạn tuyên bố rằng bất kỳ lớp nào sử dụng đặc điểm này cũng sẽ phải triển khai giao diện Something. Điều này đảm bảo cho ví dụ, rằng nếu bạn tĩnh biên dịch các đặc điểm và bạn gọi một phương thức từ giao diện Một cái gì đó, biên dịch đó sẽ không thất bại. tất nhiên đối với Groovy tiêu chuẩn, điều này là không cần thiết, vì gõ vịt.

+0

đây là * chính xác * những gì tôi đang tìm kiếm, cảm ơn! –

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