2017-02-07 5 views
0
나는 기본적으로 형식적인 의미에서 다중 상속을 필요로하는 프로젝트를 진행하고

을 여러 상속을 시뮬레이션스칼라

def alpha(x: X) 
def beta(y: Y) 

는 동적으로 단지 XY에서 모든 정의를 병합하는 클래스 XY를 만들려는 여전히 타입 안전성을 유지합니다. 더 구체적으로 이전에 정의 된 alphabeta은 여전히이 병합 된 클래스를 허용합니다.

나는 스칼라 예를 들어, 특성에 혼합 허용 알고 : 잘 작동

trait T 
class A 

val ta = new A with T 

합니다.

그러나, 나는 클래스와 함께 할 수없는 다음 with ..으로

class X 
class Y 

val xy = new X with Y 

는 특성해야합니다.

trait xV extends X 
trait yV extends Y 

val xy = new xV with yV 

불행하게도이 작동하지 않고 다음과 같은 오류를 제공합니다 :

나는 다음을 수행하여이 문제를 우회 시도

Error:(33, 26) illegal inheritance; superclass X 
is not a subclass of the superclass Y 
of the mixin trait yV 
    val xy = new xV with yV 

어떤 도움을 주시면 감사하겠습니다.

편집 :

가 명확히하기 위해 내가 클래스 X 또는 Y을 수정할 수 없습니다 수 있습니다.

답변

2

에서 (메소드)을 상속 할 수 없습니다. 그러나

More specifically that the previously defined alpha and beta still accept this merged class.

이 특정 요구

는 암시 적 변환을 사용하여 달성 할 수 있습니다

class XY { 
    val x = new X 
    val y = new Y 
} 

object XY { 
    implicit def toX(xy: XY): X = xy.x 
    implicit def toY(xy: XY): Y = xy.y 
} 

는 또한 X 호출 할 수 년대와 Y '직접의 방법이 있습니다.

예 :xy match { case x: X => ...은 일치하지 않으며 마찬가지로 xy.isInstanceOf[X]은 false입니다. X 또는 YObject 메서드 중 하나를 재정의하는 경우 : equals, hashCode 또는 toStringXY으로 상속되지 않습니다.

+0

이것은 실제로 매우 유용 할 수 있습니다. 다시보고 할게. 고맙습니다. – Crembo

+0

이 솔루션이 어느 정도 작동하는 것처럼 보입니다. 그러나'toX' 변환이'toY'보다 우선 적용되도록하는 방법이 있습니까? – Crembo

+0

예,'toY'를'object XY'가 연장하는 형질로 옮기십시오. –

2

스칼라에는 두 번째로 상속 된 Diamond Shape 상속 패턴을 피하기 위해 다중 상속 C++ 스타일이 없습니다.

스칼라가 제공 한 solutionTrait의 형태로 믹스 인을 제공합니다. 메소드 구현 충돌을 해결하기 위해 구현 된 마지막 특성 (가장 오른쪽의 특성)이 선택됩니다.

그래서 X 또는 Y 중 적어도 하나는 형질이다,하지 않는 한, A이 말 그대로 불가능하다 이렇게 모두