2014-12-14 1 views
3

변형 가능한 이름 필드가 필요한 일부 클래스를 지원하는 Renamable 특성을 정의하고 싶습니다. 는 여기에서 내 첫 번째 샷 :"무한 자기 유형"과 같은 것이 있습니까?

trait Renamable { 
    self => 
    var name:String = _ 

    def withName(name:String) = { 
     self.name = name 
     self 
    } 
} 

class Person extends Renamable { 
    def sayHello = println(s"Hello, i am $name") 
} 

내 문제는 withName() 반환 형식이 체인 방법은 다음과 같이 호출에 저를 허용하지 않는, Renamable로 추정된다는 점이다 :

new Person().withName("Julio").sayHello 
//Error: value sayHello is not a member of Renamable 

내가했습니다 내가 자체 형식 주석을 가질 수 및 반환 형식으로 사용할 수 있지만 미리 사용할 수있는 형식을 모르는 읽습니다. 나는 무한대로 형질을 사용하는 계급과 같은 복귀를 원합니다.

"제한없는 자체 유형"을 사용할 수 있습니까?

답변

8

this.type (아마도 self.type도 사용할 수 있습니다)을 사용할 수 있습니다. 정말 감사합니다,

trait Renamable { 
    var name:String = _ 

    def withName(name:String): this.type = { 
     this.name = name 
     this 
    } 
} 
+0

놀라운 :이 유형의 유일한 유효 값은 호출 사이트가 반환 된 값은 호출 수신기가 있음을 알 수 있습니다 따라서 this입니다! –

관련 문제