2010-07-02 7 views
7

다음 두 가지의 차이점은 무엇입니까?특성에 관한 질문

1 #

trait B extends A { 

} 

2 # A는 추상 클래스입니다

trait B { self: A => 

} 

.

> > 편집 :

플러그 비행 및 꽥꽥 행동으로 Duck의 다음과 같은 예에 대해 설명해주십시오 :

abstract class Duck { 
    def fly(): Unit 
    def quack(): Unit 
    def swim() { 
    println("Woodoowoodoowoodoo...") 
    } 
} 

trait FlyingWithWings extends Duck { 
    override def fly() { 
    println("Me can fliez! :D") 
    } 
} 

trait FlyingNoWay { self: Duck => 
    def fly() { 
    println("Me cannot fliez! :(") 
    } 
} 

trait Quack extends Duck { 
    override def quack() { 
    println("Quack! Quack!") 
    } 
} 

trait MuteQuack { self: Duck => 
    def quack() { 
    println("<<Silence>>") 
    } 
} 

class MallardDuck extends Duck with FlyingWithWings with MuteQuack 

object Main { 
    def main(args: Array[String]) { 
    val duck = new MallardDuck 
    duck.fly() 
    duck.quack() 
    } 
} 

출력 :

내게 fliez 수 있습니다! : D
< < 침묵 >> 제 B 예에서

+4

http://stackoverflow.com/questions/2224932/difference-between-trait-inheritance-and-self-type-annotation, http://stackoverflow.com/questions/1990948의 사본 자체를 찾습니다./what-that-the-the-difference-scala-self-types-and-trait-subclasses – VonC

답변

5

두 번째 경우 B는 A가 예상되는 위치에서 사용할 수 없으며 특정 A에 "부착"되도록 설계되었습니다. 따라서 첫 번째 경우에 A는 추상이 될 수 있고 B는 구현할 수 있습니다 누락 된 메서드는 인스턴스화 가능한 형식으로 만듭니다. 두 번째 경우에는 "전체 A"가 필요하며 일부 기능 만 추가하면됩니다.

그래서 "is a ..."관계 대신 "a ... in a ..."관계를 생각할 수 있습니다.

+0

누구를 선호해야합니까? 그리고 왜? –

+0

기본 특성을 실제로 확장하는지 여부에 따라 다릅니다. 예 : 특성 그래프를 가지고 있다면 새로운 특성 ColoredGraph는 분명히 "새로운 종류의 그래프"이며 기본 특성을 확장해야합니다. 반면에 findCycles 메소드로 특성을 추가하면이 특성은 그래프와 함께 사용될 때만 의미가 있지만 새로운 종류의 그래프를 생성하지는 않으며 일부 기능을 추가하기 때문에 두 번째 버전을 선택하게됩니다 이 경우에는 자기 유형이 있습니다. 어떤 경우에는 그 차이가 명확하지 않지만, 어떤 경험을 통해 어떤 버전이 디자인에 더 잘 맞는지 알 수 있습니다. – Landei

+0

나는 당신이 나를 잡았다 고 생각하지 않습니다. 내가 다시 말해 보도록하겠습니다. 제 질문에서,'A'는 '특성'이 아니라 '추상 클래스'입니다. 여기에 포함 된 예제에서는 두 가지 방법으로 비헤이비어를 플러그인 (또는 혼합) 할 수 있습니다. ('FlyingWithWings'는 확장자를 사용하는 반면'MuteQuack'는 자체 타입 주석을 사용합니다.) 그래서 언제 다른 것을 선호해야합니까? –

1

A의 특수화이다. 두 번째는 특성 B이 항상 A (클래스, 형질 또는 다른 유형이 될 수 있음)의 하위 유형이거나 어떤 유형으로 혼합되어야한다는 것을 의미합니다.

+2

특성이 클래스를 확장 할 수 없음 – Aymen

+0

그 사실을 모르지만 REPL에서 시도해 보았습니다. . 그래도 직접 조상에 하나 이상의 클래스를 가질 수는 없으므로 다중 상속을 얻을 수 없습니다 (클래스 확장을 할 수는 없지만 그 이유는 무엇입니까). – Theo