2012-07-13 1 views
7

스칼라의 explicitly-typed self references의 가장 일반적인 사용되는 모듈의 의존성이 같은 선언 ", Cake pattern"는있는 것 같다 B, A, 잠시 케이크 패턴을 무시하고 C 이러한 유형의 매개 변수로, 모든 타입 수준의 일을 참조 할 수 있습니다 :유용성은

class Outer[A, B, C] { 
    class Inner { this: A with B with C => 
    // ... 
    } 
} 

... 또는 추상 형식 구성원 : A, BC이 특징으로 알려져 있지 않기 때문에이 경우도에서

class Outer { 
    type A 
    type B 
    type C 
    class Inner { this: A with B with C => 
    // ... 
    } 
} 

우리가, abstract class Inner extends A with B with C을 쓸 수 있었다. 명시 적으로 형식화 된 자체 참조가 필요합니다. 그러나, 나는 오직 케이크의 특성으로 수행 패턴을 본 적이 :이 경우

trait A { def a } 
trait B { def b } 
trait C { def c } 
class Foo { this: A with B with C => 
    // ... 
} 

을, 우리는 대신 내가 잘못 아니에요 경우 같은 의미를 가지고있는, 직접 abstract class Foo extends A with B with C를 작성할 수 있습니다. 나 맞아? 그렇지 않다면 그들은 어떻게 다른가? 그렇다면 왜 모든 사람이 관계없이 명시 적으로 형식화 된 자체 참조를 사용하는 것입니까?

+0

가능 중복 [스칼라 유형 및 자기 특성 서브 클래스 사이의 차이가 무엇인가요? (http://stackoverflow.com/questions/1990948/what-is-the-difference-between-scala-self 유형과 형질 하위 클래스) – sschaef

+1

@sschaef 거기에 다른 질문이 있지만, 그의 대답 아래 다니엘의 의견 중 하나는 내가 찾고있는 대답일지도 모른다. 아마 'public' 상속 대'protected 'C++의 상속? – mergeconflict

+0

나를 위해 두 가지 질문은 같은 것을 알고 싶어하는 것처럼 보입니다. 그것들은 추상적 인 클래스와 특성이 같은 방향과 특성이 다릅니다. 아니면 내가 근본적으로 잘못된 것을 이해 했습니까? – sschaef

답변

6

그것은 내가 간과 두 가지 차이가있는 것처럼 보인다

  1. 명시 적 자기 형 주석과 간단한 extends 키워드 모두가를 설명했지만 "입니다-는"두 가지 유형 사이의 관계, 그 관계는 전자의 경우에 외부에서 볼 수 없습니다 :

    scala> trait T 
    defined trait T 
    
    scala> class C { this: T => } 
    defined class C 
    
    scala> implicitly[C <:< T] 
    <console>:10: error: Cannot prove that C <:< T. 
    

    케이크 패턴에 당신이 당신의 "모듈"개체가 실수로, 다형 적 형질의 하나로서 이용되고 싶지 않기 때문에 이것은 좋은 일이다에 의존한다.

  2. As noted explicitly by Mushtaqindirectly by Daniel의 경우 자체 유형 주석을 사용할 때 종속성이 주기적 일 수 있습니다. 순환 종속성은 매우 일반적이며, 반드시 나쁜 것은 아닙니다 (상호 의존적 인 구성 요소가 초기화를 위해 서로를 필요로하지 않거나 어떤 식 으로든간에 tie the knot을 가질 수 있다고 가정 할 때). 따라서 상속에 대한 자체 유형 주석의 또 다른 이점이 있습니다.

1

상속을 사용하면 초기화 순서를 결정하게됩니다. 자체 유형을 사용하면 해당 유형을 그대로 두십시오.

다른 차이점이 있지만 대부분은 구현 세부 사항이며 사라질 수 있다고 생각합니다. 나는 을 알고 있습니다. 그들 중 일부는입니다.

+1

나는 "상속을 사용하면 신이 새끼 고양이를 죽인다"는 것을 선호했을 것입니다. – mergeconflict

+0

더 심각한 점은 ... 여기에 왜 경로 의존형을 언급하는지 이해할 수 없다. 그들은'extended'와 self 타입을 사용하는 것 사이의 선택에 차이를 낳습니까? – mergeconflict

+0

@mergeconflict 다시 생각해 보면 실제로 확장되는 클래스는 종종 최상위 수준입니다. 중첩 된 클래스는 대개 내부에서 참조됩니다. 나는 그 대답에서 그걸 떨어 뜨릴 것이라고 생각하지만, 초기화 순서는 걱정이다. 다른 차이점이 있지만, 이전에 설계된 것보다 구현 세부 사항이 많은 효과를 내기 위해 더 높은 권한으로 수정되었습니다. –