[multiple-inheritance] 믹스 인 대 특성

Mixins와 Traits의 차이점은 무엇입니까?

Wikipedia에 따르면 Ruby 모듈은 일종의 특성과 비슷합니다. 어떻게 요?



답변

  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.
메소드의 의미론은 그것이 특성에 정의되어 있는지 또는 특성을 사용하는 클래스에 정의되어 있는지에 의존하지 않습니다.

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


답변

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

http://dlang.org/mixin.html

http://dlang.org/traits.html

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

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

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


답변