2016-06-09 1 views
1

스칼라에서는 혼합 클래스를 만드는 특성을 가질 수 있습니까 final?혼합 할 때 클래스를 최종 클래스로 변환

이 클래스가 특성에서 혼합되면 클래스에서 상속하지 못하게해야하지만 이것이 가능한지 확실하지 않습니다. 어쩌면 나는 그것을위한 매크로가 필요할 것이다.

트릭은 회원을 특성에 두 번 섞는 것을 피하기 위해 정의하는 것과 같지만 달성해야하는 것은 아닙니다.

예 :

trait MyTrait 
class A extends MyTrait 
class B extends A 
def myFun[T <: MyTrait](t: T) 

이 기능뿐만 아니라/믹스 인 MyTrait을 구현하지만 T는 기본 클래스이며, 무엇을 실제로 t로 전달하는 경우 작동하지 않습니다 로직을 포함한다고 가정 할 T이 필요 자식은 T입니다. 예 : myFun[A](new B).

분명히 이것은 대소 문자가 있지만 어쩌면 매개 변수로 전달 된 t이 정확히 T이어야하며 그 중 하나의 자식이 아닌지 확인/지정하는 방법이 있습니다. 이것이 가능한지 나는 모른다. 그리고 그것이 최선의 해결책이 될 것이다.

찾을 수있는 가장 가까운 것은 T이 최종이며 가장 좋은 것은 적용하는 MyTrait에 무엇인가를 쓰는 것입니다.

내 질문에.

또는 T이 사례 클래스인지 어떻게 확인할 수 있습니까?

+1

나는 그것이 가능하지 않다고 생각한다. 달성하고자하는 일에 대해 좀 더 자세히 설명해 주시겠습니까? –

+0

재미있는 부분은 Miles Sabin입니다. https://gist.github.com/milessabin/ace99b2feaa6e4e8822cda08d79cb91e – Haspemulator

답변

0

아니요, 아닙니다. 매크로는 도움이되지 않습니다. 주석을 사용하거나 메소드를 호출하여 매크로를 트리거 할 수 없습니다 (아는 한). 어떤이 방법에 대한

+0

같은 목적으로 특성 대신 주석을 사용할 수도 있습니다. –

+0

원하는 클래스에 주석을 달아야합니다. 결승전을 치르면 최종 결정을 내리는 것이 더 쉽습니다. –

+0

정확히 그 주석은 다른 의미를 가질 수 있으며, 그 외에도 클래스를 최종적으로 만들 수 있습니다. 그러나 나는 매크로를 가지고 노는 것보다 실제 코드를 선호한다. –

0

는 : 그것은 특성과 아무 상관이 없기 때문에

trait MyTrait 
class A extends MyTrait 
class B extends A 

def myFun[T](t: T)(implicit ev: T =:= A) =() 
defined function myFun 
@ myFun(new A) 

@ myFun(new B) 
Main.scala:61: Cannot prove that cmd2.B =:= cmd1.A. 
myFun(new B) 
    ^
Compilation Failed 

그것은 당신이 무엇을 물어에서 약간 다릅니다. 단지 그 유형의 자식이 아닌 A 유형을 해당 함수로 전달할 수 있습니다.

+0

하지만 'A'는 특정 유형이므로 일반화해야합니다. 나는't'가 정확히'T'의 인스턴스인지,'T'가 무엇이든,'T <: MyTrait'의 어떤 인스턴스인지를 확인해야합니다. –

관련 문제