믹스 인 또는 특성이 일반 다중 상속보다 어떻게 더 낫습니까?


54

C ++에는 일반 다중 상속이 있으며 많은 언어 디자인이 위험하다고 금지합니다. 그러나 Ruby 나 PHP와 같은 일부 언어는 이상한 구문을 사용하여 동일한 작업을 수행하고이를 믹스 인 또는 특성이라고합니다. 믹스 인 / 특성은 일반 다중 상속보다 남용하기가 어렵다는 것을 여러 번 들었습니다.

구체적으로 덜 위험하게 만드는 것은 무엇입니까? 믹스 인 / 특성으로는 불가능하지만 C ++ 스타일 다중 상속으로는 가능합니까? 그들과 다이아몬드 문제가 발생할 수 있습니까?

마치 다중 상속을 사용하는 것처럼 보이지만 그것들이 믹스 인 / 특성이라는 변명을 사용하여 사용할 수 있습니다.


7
이것에 대해 잘 쓰여지고 사려 깊고 철저한 답변을 게시하는 사람을 기대합니다.
Robert Harvey

7
루비와 PHP는 믹스 인과 특성을 도입하지 않았습니다. Mixins는 Flavors (1980)에 소개되었고 Traits는 Squeak Smalltalk (2001)에 소개되었습니다. Flavors는 다중 상속을 가진 최초의 객체 지향 언어였으며 믹스 인을 사용했습니다. C ++은 Flavors 9 년 후인 1989 년에 출시 된 버전 2.0에서만 다중 상속을 받았습니다. 따라서 질문은 : Flavors는 일반 믹스 인을 가지고 있지만 C ++과 같은 일부 언어는 동일한 일을 수행하고 다중 상속이라고하는 이상한 구문을 도입합니다.
Jörg W Mittag

답변:


31

본격적인 클래스와 함께 사용할 때 다중 상속에는 여러 가지 문제가 있지만 모두 모호성을 중심으로 합니다 .

모호성은 몇 가지 다른 방식으로 나타납니다.

  1. 동일한 필드를 가진 두 개의 기본 클래스가 x있고 파생 된 유형이 묻는다면 x무엇을 얻습니까?
    • x변수의 유형이 일치하지 않으면 추론 할 수 있습니다.
    • 그것들이 같은 타입이라면, 그것들을 같은 변수에 병합하려고 시도 할 수 있습니다.
    • 당신은 항상 이상한 정규화 된 이름으로 노출시킬 수 있습니다.
  2. f동일한 서명을 가진 동일한 기능을 가진 두 개의 기본 클래스가 있고 누군가 호출 f하면 호출됩니다.
    • 두 기본 클래스가 다른 공통 가상 조상 (다이아몬드 문제)을 공유하면 어떻게 될까요?
    • 기능이 다르지만 호환되는 서명이있는 경우 어떻게합니까?
  3. 두 개의 기본 클래스로 클래스를 구성 할 때 기본 클래스의 생성자 중 어느 것이 먼저 호출됩니까? 당신이 개체를 파괴하면 어느 것이 죽습니까?
  4. 객체를 메모리에 배치 할 때 어떻게 일관되게 수행합니까?
  5. 3 가지 기본 클래스로 이러한 모든 사례를 어떻게 처리합니까? 10?

그리고 그것은 동적 디스패치, 타입 추론, 패턴 매칭 및 내가 알지 못하는 것들이 언어가 전체 클래스의 다중 상속을 지원할 때 더 어려워지는 것을 무시합니다.

특성 또는 믹스 인 (또는 인터페이스 또는 ...)은 모호성이 없도록 형식의 기능 을 구체적으로 제한 하는 모든 구성입니다 . 그들은 거의 아무것도 자신을 소유 하지 않습니다 . 이렇게하면 변수가 두 개나 함수가 없기 때문에 유형의 구성이 더 매끄럽게됩니다. 변수와 참조가 있습니다. 기능과 서명. 컴파일러는 수행 할 작업을 알고 있습니다.

다른 일반적인 접근 방식은 사용자가 한 번에 하나씩 유형을 "빌드"(또는 혼합)하도록하는 것입니다. 기본 클래스가 새 유형의 동등한 파트너 인 대신 한 유형을 다른 유형에 추가합니다. 일반적으로 재정의 된 비트의 이름을 바꾸거나 다시 노출하는 선택적 구문을 사용하여 기존 유형을 재정의합니다.

믹스 인 / 특성으로는 불가능하지만 C ++ 스타일 다중 상속으로는 가능합니까?

언어에 따라- 여러 기본 클래스의 변수에 대한 함수 및 스토리지 구현 을 병합 하여 파생 된 유형으로 노출시키는 것은 일반적으로 번거 롭거나 불가능 합니다.

그들과 다이아몬드 문제가 발생할 수 있습니까?

때로는 언어에 따라 덜 심한 변형이 표시되지만 대개는 그렇지 않습니다. 특성의 전체 요점은 이러한 종류의 모호성을 깨뜨리는 것입니다.


인스턴스에 이러한 "빌딩"유형을 허용하는 언어 / 기술을 예로들 수 있습니까?
Gherman

@german-나는 스칼라 전문가는 아니지만 with키워드 가 무엇인지 이해 합니다.
Telastyn

"모호성이 없도록 유형의 기능을 구체적으로 제한하는 구성": 어떤 종류의 한계? 인터페이스에는 변수가 없으므로 한 가지 한계이지만 Scala 특성과 Ruby 모듈에는 제한이 있습니다. 다른 방식으로 제한되어 있습니까?
David Moles

@DavidMoles-이것이 일반적인 방법이므로 가상 디스패치 규칙에 대한 제한 사항을 보았습니다 (C #의 명시 적으로 구현 된 인터페이스를 생각하십시오).
Telastyn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.