2014-06-15 3 views
0

종종 유형 별칭을 사용하여 스칼라에서 새로운 클래스 생성을 피하기를 원합니다. 그러나 이러한 유형의 정적 메서드도 필요합니다. CardValue 유형 예를 들어 다음과 같은 고려 :스칼라 : 객체 별칭을 입력하십시오.

package object cards { 
    /** 
    * Type representing card values from 2 to A 
    */ 
    type CardValue = Byte 
} 

object CardValue { 
    /** 
    * Creates CardValue 
    * 
    * @param value value index from 0 (2) o 12(A) 
    * @tparam T any Numeric type which can be converted to Byte 
    * @return new CardValue 
    */ 
    def apply[T <% Byte](value: T): Card = { 
    require(value >= 0 && value < 13, "Wrong card value index. CardValue is enumeration from 0 to 12.") 
    value 
    } 

    /** 
    * 
    * @return Correct string for card value 
    */ 
    override def toString: String = { 
    case 8 => "T" 
    case 9 => "J" 
    case 10 => "Q" 
    case 11 => "K" 
    case 12 => "A" 
    case x: Number => (x.byteValue() + 2).toString 
    } 
} 

이 코드로 현재 두 가지 문제가 있습니다 1. 그것이 내가 내가 계획 한대로 그 코드 (예를 들어 작동합니다 확실하지 않다 2. 컴파일되지 않습니다 Byte가 아닌 객체에서 toString을 호출 할 것입니다.

이 모든 것을 잘못된 방식으로 수행하고 있으며 별칭을 이와 같이 사용할 수 없습니까?

답변

2

별칭이 실제로 어떤 형식인지는 알 수 없습니다. type CardValue = Byte을 선언 할 때 CardValue은 실제 유형이 아니어야합니다. 이 구문을 사용하면 CardValue은 문자 그대로 Byte 유형이 될 것이므로 이름을 제외하면 다른 클래스로 확장하지 않는 한 메소드 나 다른 것을 무시할 수 없습니다.

이 코드의 다른 문제는 toString 메서드가 개체가 아닌 클래스에 있어야한다는 것입니다. object CardValuecase class CardValue(value: Byte)의 보조 개체 여야하며 toString을 정의 할 수 있습니다.

case class CardValue(value: Byte) { 

    require(value >= 0 && value < 13, "Wrong card value index. CardValue is enumeration from 0 to 12.") 

    override def toString: String = this.value match { 
     case 8 => "T" 
     case 9 => "J" 
     case 10 => "Q" 
     case 11 => "K" 
     case 12 => "A" 
     case x: Number => (x.byteValue() + 2).toString 
    } 

} 
+0

감사합니다. 내 모든 질문에 대답합니다. 또한 객체 구현을 제거해야합니다. 사례 클래스는 기본 적용 메소드 – GrayR

+0

과 함께 제공됩니다. 당신의'require '를 그것이 속한 case 클래스로 옮길 것이다. –