2016-10-31 2 views
0

< : B라면 A는 하위 유형이고 B는 수퍼 유형이라는 것을 알았습니다. B의 자리에 A를 사용한다고 생각했습니다. B의 모든 속성을 상속 받았기 때문에 B가 필요합니다. B. 이제 내 문제는 여기에스칼라에서 수퍼 유형을 찾는 방법

type One 
type Two 
type Three 
type Four 
type Five 
type Six 
type Seven 
type Eight 

type Fun1 = { val a: One } => { val b: Two } 
type Fun2 = { val b: Two } => { val a: One } 

type SuperType = { 
?? 
} 

type TypeOne = { 
    def apply: { val func: Fun1 ; val c: Three } => { val b: Two ; val d: Four } 
    val g: Seven 
} 

type TypeTwo = { 
    def apply: { val func: Fun2 ; val e: Five } => { val b: Two ; val f: Six } 
    val h: Eight 
} 

어떻게하면 TypeOne 및 TypeTwo의 상위 유형 인 SuperType을 만들 수 있습니까? 'Any'라는 키워드 만 사용하면됩니다. 또한

def apply: {val func: Fun1}=>{val b: Two} 

내가 볼과의 관계 어쩌면 이것은 당신이 찾고 있지만이 작업을 수행하는지 아니다

+0

매우 구체적인 스칼라 하위 집합을 고수하고있는 것처럼 보입니다. 그렇게 할 이유가 있습니까? – stefanobaghino

답변

1

내가 볼 수있는 유일한 관계는 Fun1Fun2입니다. 둘 다 함수이므로, SuperType은 일반적인 인수가있는 함수입니다. 필자는 스 니펫에 노출 된 스타일에 가능한 한 많이 집착하려고 노력했습니다 (스칼라에서는 유형 계층을 정의하는 훨씬 더 관용적 인 방법을 제공하지만).

type SuperType = { 
    type A 
    type B 
    def apply: { val a: A } => { val b: B } 
} 

type Fun1 <: SuperType { 
    type A = One 
    type B = Two 
} 
type Fun2 <: SuperType { 
    type A = Two 
    type B = One 
} 
1

다른 모든 값 사이하지 않기 때문에 시도?

sealed trait SuperType 
trait TypeOne extends SuperType { 
    def apply: { val func: Fun1 ; val c: Three } => { val b: Two ; val d: Four } 
    val g: Seven 
} 

trait TypeTwo extends SuperType { 
    def apply: { val func: Fun2 ; val e: Five } => { val b: Two ; val f: Six } 
    val h: Eight 
} 
3

원하는 관계를 얻는 방법 중 하나는 다음과 같습니다.

abstract class SuperType 
class TypeOne extends SuperType { /* your code here */ } 
class TypeTwo extends SuperType { /* etc. */ } 

type 키워드

은 대부분 어딘가에 계층 구조의 사슬 아래로, 타입 별칭을 만들거나이 구체적으로 나중에 정의되는 추상적 인 타입을 선언하는 데 사용됩니다. 사실, 게시 한 코드는 실제로 아무 것도 만들지 않습니다. 이러한 유형의 객체는 인스턴스화 할 수 없습니다.

실제로, 당신이하려는 경우 추상 형식의 관계를 선언하면 type TypeOne <: SuperType과 같은 것이 원하는 것입니다.

+0

_abstract_ 관계로 정확히 무엇을 의미합니까? – stefanobaghino

관련 문제