2012-10-24 26 views
7

Có cách nào để tạo phương thức luôn trả về loại của cùng một lớp được gọi là không?Loại hình này trong Scala

Hãy để tôi giải thích:

class Shape { 
    var mName: String = null 
    def named(name: String): Shape = { 
    mName = name 
    this 
    } 
} 

class Rectangle extends Shape { 
    override def named(name: String): Rectangle = { 
    super.named(name) 
    this 
    } 
} 

này hoạt động, nhưng có một cách để làm điều này mà không cần phải ghi đè lên named chức năng trong tất cả các lớp con của tôi không? Tôi đang tìm một cái gì đó như thế này (không hoạt động):

class Shape { 
    var mName: String = null 
    def named(name: String): classOf[this] = { // Does not work but would be great 
    mName = name 
    this 
    } 
} 

class Rectangle extends Shape { 
} 

Bất kỳ ý tưởng nào? Hay là điều này không thể thực hiện được ?

Trả lời

18

Bạn cần sử dụng this.type thay vì classOf[this].

class Shape { 
    var mName: String = null 
    def named(name: String): this.type = { 
    mName = name 
    this 
    } 
} 

class Rectangle extends Shape { 
} 

Giờ đây để chứng minh rằng nó hoạt động (trong Scala 2,8)

scala> new Rectangle().named("foo") 
res0: Rectangle = [email protected] 

scala> res0.mName 
res1: String = foo 

this.type là một biên dịch kiểu tên kiểu, trong khi classOf là một nhà điều hành mà được gọi là khi chạy để có được một java.lang.Class đối tượng. Bạn không thể sử dụng classOf[this] bao giờ hết, vì thông số cần phải là tên loại. Hai tùy chọn của bạn khi cố gắng lấy đối tượng java.lang.Class là gọi classOf[TypeName] hoặc this.getClass().

+0

Điều đáng nói đến là loại singleton không thể được sử dụng cho các trường hợp không phải là 'this'. – pedrofurla

+0

@pderofurla: Có vẻ như nó có thể xảy ra với các kiểu phụ thuộc vào đường dẫn, nhưng tôi biết rất ít về các kiểu phụ thuộc vào đường dẫn trong Scala, và tôi thậm chí không chắc chắn liệu chúng có còn là thử nghiệm hay không. –

+0

Tôi không nghĩ rằng nó liên quan đến các loại phụ thuộc vào đường dẫn. Và không, các kiểu phụ thuộc vào đường dẫn không phải là thử nghiệm. – pedrofurla