Mixin 대 상속


답변:


66

믹스 인은 일반적으로 다중 상속과 함께 사용됩니다. 따라서 그런 의미에서 "차이가 없습니다".

세부 사항은 mixin이 독립형 개체로 거의 유용하지 않다는 것입니다.

예를 들어 "ColorAndDimension"이라는 이름의 믹스 인이 있다고 가정 해 보겠습니다.이 믹스 인은 색상 속성과 너비 및 높이를 추가합니다.

이제 Shape 클래스, Sprite 클래스, Car 클래스 등에 ColorAndDimension을 추가 할 수 있습니다. 그러면 모두 동일한 인터페이스 (예 : get / setColor, get / setHeight / Width 등)를 갖게됩니다.

따라서 일반적인 경우 mixin IS 상속입니다. 그러나 믹스 인이 "기본"클래스인지 아니면 단순히 믹스 인인지에 관해서는 전체 영역에서 클래스의 역할의 문제라고 주장 할 수 있습니다.


편집-명확하게하기 위해.

예, 오늘날의 현대 용어에서 믹스 인은 관련 구현이있는 인터페이스로 간주 될 수 있습니다. 정말 평범하고 오래된 일상적인 클래스를 사용하는 평범하고 오래된 일상적인 다중 상속입니다. MI의 특정 응용 프로그램 일뿐입니다. 대부분의 언어는 특별한 지위를주지 않습니다. 그것은 독립형으로 사용되는 것이 아니라 "혼합"되도록 설계된 클래스 일뿐입니다.


29

믹스 인과 상속의 차이점은 무엇입니까?

, 혼합은 추가 기능을 제공하기 위해에서 당신이 상속 할 수있는 기본 클래스입니다. 의사 코드 예 :

class Mixin:
    def complex_method(self):
        return complex_functionality(self)

"mix-in"이라는 이름은 다른 코드와 혼합되도록 의도되었음을 나타냅니다. 따라서 혼합 클래스를 자체적으로 인스턴스화하지 않을 것이라고 추론합니다. 다음 개체에는 데이터가 없으며 complex_method를 호출하도록 인스턴스화하는 것은 의미가 없습니다. (이 경우 클래스 대신 함수를 정의 할 수도 있습니다.)

>>> obj = Mixin()

종종 믹스 인은 다른 기본 클래스와 함께 사용됩니다.

따라서 믹스 인은 상속의 하위 집합 또는 특수한 경우입니다.

단일 상속보다 믹스 인을 사용하는 이점은 기능에 대한 코드를 한 번 작성한 다음 여러 다른 클래스에서 동일한 기능을 사용할 수 있다는 것입니다. 단점은 사용되는 곳이 아닌 다른 곳에서 해당 기능을 찾아야 할 수도 있다는 것이므로 가까이에 두어 단점을 완화하는 것이 좋습니다.

저는 개인적으로 많은 유사한 코드를 단위 테스트하는 단일 상속을 통해 사용하는 데 필요한 믹스 인을 찾았지만 테스트 케이스는 기본 케이스의 상속을 기반으로 인스턴스화되며 코드를 가깝게 유지하는 유일한 방법입니다. 커버리지 번호를 엉망으로 만들지 않고 손 (동일한 모듈에서)은 객체에서 상속하고 하위 케이스가 범용 테스트 케이스베이스와 그들에게만 적용되는 커스텀베이스 모두에서 상속 받도록하는 것입니다.

추상 기본 클래스와 비교 및 ​​대비되는 믹스 인

둘 다 인스턴스화 할 수없는 부모 클래스의 한 형태입니다.

믹스 인이 기능을 제공하지만 직접 사용 할 수 없습니다. 사용자는 (하위) 클래스를 통해 사용하도록되어 있습니다.

추상 기본 클래스는 인터페이스를 제공하지만 사용 가능한 기능이없는. 사용자는 인터페이스에서 호출하는 기능을 작성하기위한 것입니다.

class Abstraction(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def complex_method(self):
        return complex_functionality(self)

구체적인 메서드를 사용하여 기능을 구현하려면 하위 클래스가 필요하기 때문에이 개체를 인스턴스화 할 수 없습니다 (에서 기능에 액세스 할 수 있음 super()).

>>> obj = Abstraction()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Abstraction with
abstract methods complex_method

Python에서 abc모듈의 일부 클래스는 상속을 통해 기능을 제공하는 부모 클래스와 하위 클래스에 의해 구현되어야하는 추상 인터페이스의 예입니다. 이러한 아이디어는 상호 배타적이지 않습니다.

요약

간단히 말해서 믹스 인은 자체적으로 인스턴스화 할 수없는 기본 클래스 일 뿐이며 일반적으로 다중 상속에서 보조 기본 클래스로 사용됩니다.


18

믹스 인은 구현 목적으로 사용되는 (다중) 상속의 특정하고 제한된 경우입니다. 일부 언어 (예 : Ruby)는 일반화 된 다중 상속을 지원하지 않고이를 지원합니다.


7

Mixin은 추상적 인 개념이며 요구 사항을 충족하는 모든 것이 mixin으로 간주 될 수 있습니다.

다음은 Wikipedia의 정의입니다.

객체 지향 프로그래밍 언어에서 mixin은 다른 클래스의 부모 클래스가 될 필요없이 다른 클래스에서 사용할 메서드를 포함하는 클래스입니다. 다른 클래스가 mixin의 메소드에 액세스하는 방법은 언어에 따라 다릅니다. Mixins는 때때로 "상속"이 아니라 "포함 된"것으로 설명됩니다.

간단히 말해, 상속과의 주요 차이점은 믹스 인이 상속과 같이 "is-a"관계를 가질 필요가 없다는 것입니다.

구현 관점에서 보면 구현이있는 인터페이스라고 생각할 수 있습니다. 예를 들어 Java의 추상 클래스는 Java가 다중 상속을 지원하는 경우 믹스 인으로 간주 될 수 있습니다.


굵은 문장을 이해하기가 어렵습니다. "(B?) A와의 차이점은 (B?) A와 같은 것이 필요하다는 것"처럼 들립니다. 차이점이나 유사성에 대해 이야기하고 있습니까?
RayLuo

@RayLuo 죄송합니다 ... 오타를 만들었습니다. 혼동해서 죄송합니다. 믹스 인은 "is-a"관계를 가질 필요가 없습니다
Alex

3

"믹 신은 다른 클래스 또는 믹스 인으로 구성되도록 의도 된 의미에서 클래스의 일부입니다." -DDJ

믹스 인은 단독으로 사용하기위한 것이 아니라 다른 클래스 내에서 사용해야하는 클래스 또는 코드 조각입니다. 멤버 필드 / 변수 또는 코드 세그먼트로 구성합니다. 나중에 가장 많이 노출됩니다. 상용구 코드를 복사하여 붙여 넣는 것보다 약간 낫습니다.

주제를 소개하는 훌륭한 DDJ 기사가 있습니다.

Half-Life 2 / "Source"SDK는 C ++ 믹스 인의 좋은 예입니다. 이 환경에서 매크로는 클래스에 특정 "맛"또는 기능을 제공하기 위해 추가 할 수있는 상당한 코드 블록을 정의합니다.

Source wiki 예제 : Authoring a Logical Entity를보십시오 . 예제 코드에서 DECLARE_CLASS 매크로는 믹스 인으로 간주 될 수 있습니다. 소스 SDK는 믹스 인을 광범위하게 사용하여 데이터 액세스 코드를 표준화하고 동작을 엔터티에 할당합니다.


0

다중 상속을 사용하면 새 클래스가 여러 수퍼 클래스로 구성 될 수 있습니다. 수퍼 클래스에 정의 된 메서드 만 호출 할 수 있습니다.

반면에 mixin은 다양한 부모 클래스의 동작을 전문화하는 데 사용할 수있는 추상 하위 클래스입니다. Mixins는 sayHello(): String이러한 메서드를 정의하지 않더라도 메서드 (예 :)를 호출 할 수 있습니다 .

mixin M {
    name: String
    defmethod greetings() { print sayHello() + " " + name}
}

보시다시피 sayHello()어디에도 정의되어 있지 않아도 호출 할 수 있습니다. 당신이 믹스 인을 추가하면 M클래스 C는이 C제공해야한다 sayHello()방법을.


1
첫 번째 문장의 정확성에 대해 확신하지 못함-클래스는 자신의 방법을 정의 할 수 있습니다
EugeneMi

0

나는 mixin상속을 의미하지 않는다는 점을 주목하는 것이 중요하다고 생각합니다 . Wikipedia에 따르면 Mixin 은 다음과 같습니다.

객체 지향 프로그래밍 언어에서 mixin은 다른 클래스의 부모 클래스가 될 필요없이 다른 클래스에서 사용할 메서드를 포함하는 클래스입니다. 다른 클래스가 mixin의 메소드에 액세스하는 방법은 언어에 따라 다릅니다. Mixins는 때때로 "상속"이 아니라 "포함 된"것으로 설명됩니다.

특히 perl과 같은 언어에서는 Exporter 모듈을 사용하여 믹스 인을 추가 할 수 있습니다.

package Mixins;

use Exporter qw(import);
our @EXPORT_OK = qw(pity);

# assumes it will be mixed-in to a class with a _who_do_i_pity method
sub pity {
    my ($self) = @_;
    printf("I pity %s\n", $self->_who_do_i_pity('da foo'));
}

한 번에 하나 이상의 메서드를 포함하는 모든 모듈에 혼합 될 수 있습니다.

package MrT

use Mixins qw(pity);

sub new {
    return bless({}, shift);
}

sub _who_do_i_pity {
    return 'da foo!'
}

그런 다음 MrT모듈 에서 다음 과 같이 사용할 수 있습니다.

use MrT;

MrT->new()->pity();

나는 그것이 어리석은 예라는 것을 알고 있지만, 요점을 얻습니다 ...


0

tl; dr

mixin과 다중 상속은 동일한 형식을 갖습니다. 그러나 다른 의미를 가지고 있습니다. mixin은 기본 클래스가 함수 구현을 제공합니다. 상속을 위해 기본 클래스는 인터페이스를 제공하고 하위 클래스에는 구현이 있습니다.

그러나 어쨌든 IMO보다 구성이 선호됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.