2011-07-29 3 views
5

동물의 색깔을 한 번 지정하고 싶습니다. 동일한 동물의 모든 동물에 대해 동일합니다. 하는 수 없습니다 나는 이미 규칙을 가지고,추상 객체 값 및 메소드를 스칼라로 어떻게 선언합니까?

object Dog extends Animal {val color = "green"} 
이이 객체로 할 필요가

개별 동물의 색상을

abstract object Animal {val color: String} 

를 그리고 지정

그래서 내가 할 싶습니다 동물 객체에서 선언 된 팩토리 메소드로 동물을 만들 때만 변경되었으며 팩토리 메소드는 색상에 액세스해야합니다. 예 :

abstract object Animal { 
    val color: String 
    def makeAnimal(args): Animal = ... 
} 

"클래스 만 선언되었지만 정의되지 않은 멤버가있을 수 있습니다"라는 점을 감안할 때 실제로 스칼라에서 어떻게 처리합니까?

특성을 사용하여이를 수행하는 해킹 방법을 생각할 수 있지만 더 나은 것이 있다고 기대하고 있습니다.

[편집] 그래서 복잡한 특성 때문에 값/방법을 유지하는 데 특성을 사용할 수 없습니다. 현재 솔루션은 특성을 사용하여 자식 개체를 부모 개체에 정적으로 등록하는 작업을 포함하며 개체에서 정의해야하는 특성이 아닌 값과 메서드에 액세스 할 수있게 해줍니다. 나는 여전히 더 나은 해결책을 원하고 있습니다.

답변

15

정의에 따라 object을 확장 할 수 없습니다. 그래서 그래, 당신은 특성이 필요하지만, 나는 이것에 대해 해키 아무것도 표시되지 않습니다 :

trait AnimalCompanion { 
    val color: String 
    def makeAnimal(args): Animal // if you have same args everywhere 
} 

object Dog extends AnimalCompanion { 
    val color = ... 
    def makeAnimal(args) = ... 
} 

또는 더 나은을

trait AnimalCompanion[A <: Animal] { 
    val color: String 
    def makeAnimal(args): A 
} 

class Dog extends Animal 

object Dog extends AnimalCompanion[Dog] { 
    val color = ... 
    def makeAnimal(args): Dog = ... 
} 
관련 문제