답변:
믹스 인은 일반적으로 다중 상속과 함께 사용됩니다. 따라서 그런 의미에서 "차이가 없습니다".
세부 사항은 mixin이 독립형 개체로 거의 유용하지 않다는 것입니다.
예를 들어 "ColorAndDimension"이라는 이름의 믹스 인이 있다고 가정 해 보겠습니다.이 믹스 인은 색상 속성과 너비 및 높이를 추가합니다.
이제 Shape 클래스, Sprite 클래스, Car 클래스 등에 ColorAndDimension을 추가 할 수 있습니다. 그러면 모두 동일한 인터페이스 (예 : get / setColor, get / setHeight / Width 등)를 갖게됩니다.
따라서 일반적인 경우 mixin IS 상속입니다. 그러나 믹스 인이 "기본"클래스인지 아니면 단순히 믹스 인인지에 관해서는 전체 영역에서 클래스의 역할의 문제라고 주장 할 수 있습니다.
편집-명확하게하기 위해.
예, 오늘날의 현대 용어에서 믹스 인은 관련 구현이있는 인터페이스로 간주 될 수 있습니다. 정말 평범하고 오래된 일상적인 클래스를 사용하는 평범하고 오래된 일상적인 다중 상속입니다. MI의 특정 응용 프로그램 일뿐입니다. 대부분의 언어는 특별한 지위를주지 않습니다. 그것은 독립형으로 사용되는 것이 아니라 "혼합"되도록 설계된 클래스 일뿐입니다.
믹스 인과 상속의 차이점은 무엇입니까?
, 혼합은 추가 기능을 제공하기 위해에서 당신이 상속 할 수있는 기본 클래스입니다. 의사 코드 예 :
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
모듈의 일부 클래스는 상속을 통해 기능을 제공하는 부모 클래스와 하위 클래스에 의해 구현되어야하는 추상 인터페이스의 예입니다. 이러한 아이디어는 상호 배타적이지 않습니다.
간단히 말해서 믹스 인은 자체적으로 인스턴스화 할 수없는 기본 클래스 일 뿐이며 일반적으로 다중 상속에서 보조 기본 클래스로 사용됩니다.
Mixin은 추상적 인 개념이며 요구 사항을 충족하는 모든 것이 mixin으로 간주 될 수 있습니다.
다음은 Wikipedia의 정의입니다.
객체 지향 프로그래밍 언어에서 mixin은 다른 클래스의 부모 클래스가 될 필요없이 다른 클래스에서 사용할 메서드를 포함하는 클래스입니다. 다른 클래스가 mixin의 메소드에 액세스하는 방법은 언어에 따라 다릅니다. Mixins는 때때로 "상속"이 아니라 "포함 된"것으로 설명됩니다.
간단히 말해, 상속과의 주요 차이점은 믹스 인이 상속과 같이 "is-a"관계를 가질 필요가 없다는 것입니다.
구현 관점에서 보면 구현이있는 인터페이스라고 생각할 수 있습니다. 예를 들어 Java의 추상 클래스는 Java가 다중 상속을 지원하는 경우 믹스 인으로 간주 될 수 있습니다.
"믹 신은 다른 클래스 또는 믹스 인으로 구성되도록 의도 된 의미에서 클래스의 일부입니다." -DDJ
믹스 인은 단독으로 사용하기위한 것이 아니라 다른 클래스 내에서 사용해야하는 클래스 또는 코드 조각입니다. 멤버 필드 / 변수 또는 코드 세그먼트로 구성합니다. 나중에 가장 많이 노출됩니다. 상용구 코드를 복사하여 붙여 넣는 것보다 약간 낫습니다.
Half-Life 2 / "Source"SDK는 C ++ 믹스 인의 좋은 예입니다. 이 환경에서 매크로는 클래스에 특정 "맛"또는 기능을 제공하기 위해 추가 할 수있는 상당한 코드 블록을 정의합니다.
Source wiki 예제 : Authoring a Logical Entity를보십시오 . 예제 코드에서 DECLARE_CLASS 매크로는 믹스 인으로 간주 될 수 있습니다. 소스 SDK는 믹스 인을 광범위하게 사용하여 데이터 액세스 코드를 표준화하고 동작을 엔터티에 할당합니다.
다중 상속을 사용하면 새 클래스가 여러 수퍼 클래스로 구성 될 수 있습니다. 수퍼 클래스에 정의 된 메서드 만 호출 할 수 있습니다.
반면에 mixin은 다양한 부모 클래스의 동작을 전문화하는 데 사용할 수있는 추상 하위 클래스입니다. Mixins는 sayHello(): String
이러한 메서드를 정의하지 않더라도 메서드 (예 :)를 호출 할 수 있습니다 .
mixin M {
name: String
defmethod greetings() { print sayHello() + " " + name}
}
보시다시피 sayHello()
어디에도 정의되어 있지 않아도 호출 할 수 있습니다. 당신이 믹스 인을 추가하면 M
클래스 C
는이 C
제공해야한다 sayHello()
방법을.
나는 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();
나는 그것이 어리석은 예라는 것을 알고 있지만, 요점을 얻습니다 ...