믹스 인 대 특성


답변:


214
  1. 믹스 인은 상태 (전통적인) 특성을 포함하지 않을 수 있습니다.
  2. 믹스 인은 "암시 적 충돌 해결"을 사용하고 특성은 "명시 적 충돌 해결"을 사용합니다
  3. 믹스 인은 선형화에 달려 있으며 특성이 평평 해집니다.

특성에 관한 강의

ad 1. 믹스 인에서 인스턴스 변수를 정의 할 수 있습니다. 특성은 이것을 허용하지 않습니다. 상태는 클래스를 작성하여 제공해야합니다 (= 특성을 사용하는 클래스).

ad 2. 이름 충돌이있을 수 있습니다. 두 가지 믹스 인 ( MAMB) 또는 특성 ( TATB)은 동일한 정의로 방법을 정의 foo():void합니다.

Mixin MA {
    foo():void {
        print 'hello'
    }
}

Mixin MB {
    foo():void {
        print 'bye'
    }
}

Trait TA {
    foo():void {
        print 'hello'
    }
}

Trait TB {
    foo():void {
        print 'bye'
    }
}

믹스 인에서 작성 클래스의 충돌은 C mixins MA, MB 암시 적으로 해결됩니다.

Class C mixins MA, MB {
    bar():void {
        foo();
    }
}

이 전화 foo():voidMA

반면에 특성을 사용하는 동안 작문 클래스는 충돌을 해결해야합니다.

Class C mixins TA, TB {
    bar():void {
        foo();
    }
}

이 코드는 충돌을 일으 킵니다 (의 두 정의 foo():void).

ad 3. 메소드의 의미론은 그것이 특성에 정의되어 있는지 또는 특성을 사용하는 클래스에 정의되어 있는지에 의존하지 않습니다.

다시 말해, 클래스가 특성으로 구성되어 있는지 또는 특성 코드가 클래스에 "복사-붙여 넣기"되어 있는지는 중요하지 않습니다.


5
나는 날짜 지난 일년 알고하지만 foo는 () 폼 MB 부를 것이다, 그래서 미래의 독자, 루비에, 상기 방법 양식을 혼합 마지막 모듈을 사용
rik.vanmechelen

4
스칼라의 특성은 필드를 가질 수 있는데, 이것은 그들이 "전통적인"특성이 아니라는 것을 암시 하는가?
세르지오

4
그렇습니다. 이들은 "전통적인"것이 아니라 "국가적"특성이라고합니다. statefull 특성과 mixin의 차이는 포인트 2와 3입니다.
jk_

7
잠정 -1; 'trait'와 'mixin'이라는 용어가 야생에서 사용되는 방식은 매우 일치하지 않으며 여기에있는 점 중 하나 이상이 대부분 잘못되었습니다. PHP와 Wikipedia (및 @Sergio, Scala에 따르면)는 특성이 무국적이라는 점에 동의하지 않습니다. 이 답변은 베어 어설 션으로 구성되어 있기 때문에 유용한 답변이 아니며, 이것이 개인적으로 이러한 단어를 사용하는 것 이상이라는 것이 확실하지 않습니다. 다르게 확신하기 위해, 당신의 주장을 뒷받침하기 위해 실제 세계에서 (예를 들어 실제 프로그래밍 언어에서) 용어가 어떻게 사용되는지에 대한 많은 예를 볼 필요가 있습니다.
Mark Amery

3
@AykutKllic Linearization-> "컴파일러는 모호함없이 수퍼가 무엇인지에 대한 문제를 해결합니다." ( ibm.com/developerworks/library/j-jn8 )
ben

9

이 페이지는 D 프로그래밍 언어의 차이점을 설명합니다.

http://dlang.org/mixin.html

http://dlang.org/traits.html

이 컨텍스트의 믹스 인은 코드를 즉석에서 생성 한 다음 컴파일하는 동안 코드의 해당 지점에 삽입됩니다. 간단한 DSL에 매우 편리합니다.

특성은 외부 소스에서 생성 된 코드가 아니라 컴파일 타임 외부 값입니다. 차이점은 미묘합니다. 믹스 인은 로직을 추가하고, 특성은 컴파일 타임 유형 정보와 같은 데이터를 추가합니다.

루비에 대해 잘 모르지만 이것이 도움이되기를 바랍니다.


41
D의 믹스 인과 특성은 컴퓨터 과학에서 일반적으로 사용되는 용어와 완전히 다릅니다. D에서 둘 다 자동 코드 생성을위한 프리 프로세서 프리미티브입니다. 다른 언어에서는 상속 메커니즘입니다. D에서의 명명 결정은 불행합니다.
tylerl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.