2014-12-24 2 views
3

특성의 순서가 혼합되는 동안 metter가되는 반면 특정 방식으로 명령을 강제로 수행 할 수는 있습니다. 예를 들어 나는이 있습니다스칼라 - 특성의 특정 순서를 강제하는 방법

val t = new Wink with Dash with Right with Left 

을하고 난 다음입니다 if Right NOT Left 같은 조건을 넣고 특성을 혼합하는 방법에 대한 이러한 제한을 달성하기 Dash COMES FIRST THEN Right OR Left

답변

3

한 가지 방법을 말할 수 있도록하려면 :

trait Dash[T <: Dash[T]] 
trait Right extends Dash[Right] 
trait Left extends Dash[Left] 

val t = new Wink with Dash[Right] 

이렇게하면 [T <: Dash[T]]은 오른쪽 또는 왼쪽 특성을 즉시 제공해야합니다. (오른쪽 또는 귀하의 요구 사항에 왼쪽)

반면에 확장 extends Dash[Right] 때문에 오른쪽 또는 왼쪽 특성은 대시를 사용하지 않고 혼합 할 수 없습니다. (대시 은 사용자의 요구 사항이 먼저이됩니다.)

오른쪽 또는 왼쪽을 결정하기 위해 일부 조건을 확인하는 것처럼 들립니다. 이것은 다음과 같이 할 수있다 :

val t = if (p) new Wink with Dash[Right] else new Wink with Dash[Left] 
+0

당신의 대답은 용액에 생각하는 나를 안내되어 있지만 아직도 내가 일반화, 그것을 확장 할 수 없습니다 : 그것은 그게 내가'새로운 윙크 말할 수있는 상태에 도달하기 어렵다 의미 하는가 돌연변이가있는 직선과 오른쪽 대시 (대소 문자를 순서대로 쌓을 수있는 많은 형질)도 있습니다. 대체 할 수있는 두 가지 특성 (왼쪽, 직선 및 오른쪽과 같은)이 혼합되어서는 안됩니다. – Valerin

+0

또한 논리적으로 '오른쪽'또는 '왼쪽' 내 구현에서는 'Dash'에서 아무 것도 확장하지 않지만이 이유만으로 다른 모든 특성에 섞어 쓰고 싶지는 않습니다. :( – Valerin

+1

죄송 합니다만,'콜론으로 직선으로 대시가있는 새로운 윙크 '를 쓰는 방법은 없으며 컴파일러가 제약 조건에서 나머지를하도록하십시오. 특성을 확장함으로써 제한을 가하는 것은 선택의 무기입니다 나는 여기에서 선택 하겠지만 하나는 특정 계층 구조를 생각해야한다. 그러나 다른 누군가가 이것을 처리하는 데 더 좋은 아이디어를 내놓을지도 모른다. – zunder

관련 문제