flutter

Dart mxins

paulaner80 2019. 3. 27. 11:39
반응형


나는 mixin의 가장 간결한 정의가 Wikipedia에 의해 제공된다고 생각한다.


"객체 지향 프로그래밍 언어에서 Mixin은 다른 클래스의 부모 클래스가 아니어도 다른 클래스에서 사용할 수있는 메소드를 포함하는 클래스입니다."

즉, mixins은 클래스를 확장하지 않고 메소드 (또는 변수)를 빌릴 수있는 일반 클래스입니다. 다트에서는 with 키워드를 사용하여이 작업을 수행 할 수 있습니다. 


첫 번째

클래스 B를 클래스 A의 믹스 인으로 사용하려면 다음을 수행하십시오.


class B {
method() {
print("B method");
}
}

class A with B {}

void main(List<String> args) {
A a = A();
a.method();
}



[실행결과]

B method


class A with Bclass A extends Object with B와 동일합니다.


클래스는 오브젝트를 확장 히야 믹스인으로 사용할 수 있습니다.

다른 클래스를 확장 한 클래스는 믹스인으로 사용할 수 없습니다.

Dart가 계속 진화하고 있고 Object 이외의 클래스를 확장하는 mixins를 사용할 수있는 실험적인 기능이 있기 때문에 미래에는 변할 수 있습니다. 믹스인 스펙을 확인하세요.




두번째 

Object가 아닌 클래스를 확장하는 mixin 클래스는 사용할 수 없지만 mixin 클래스를 사용하는 기본 클래스 (이 예제에서는 클래스 A)를 확장하거나 구현할 수 있습니다.


class B {
method() {
print("B method");
}
}

class C {}

class A extends C with B {}

void main(List<String> args) {
A a = A();
a.method();
print(a is B);
print(a is C);
}



[실행결과]

B method

true

true




Mixins은 다중 상속 및 코드 재사용과 같은 기능의 이점을 모방하는 프로그래밍 언어를 가능하게하는 동시에 Deadly Death of Dath (DDD)와 같은 문제가 발생할 위험을 줄입니다.


어떤 사람들은 믹스 인을 구현과의 인터페이스로 설명합니다.



What is deadly diamond of death(DDD) in multiple inheritance?


우리가 Performer라는 추상 클래스를 가지고 있다고 가정합니다.

이제 우리는 Performer를 확장하는 두 개의 구체적인 클래스 Dancer와 Singer를 만들 것입니다.

Performer를 확장하는 것이 노래와 춤을 할 수 있는 유일한 방법입니다.

이제 다트가 다중 상속을 지원하고 Musician이라는 클래스가 Dancer와 Singer 클래스를 모두 확장한다고 가정합니다.

참고로 다트는 단일 상속 만 지원합니다. 

여기서는 가정입니다. 다트가 C ++와 같은 다중 상속을 지원한다면 어떻게 될까요?


abstract class Performer {
void perform();
}

class Dancer extends Performer {
void perform() {
print('Dance Dance Dance ');
}
}
class Singer extends Performer {
void perform() {
print('lalaaa..laaalaaa....laaaaa');
}
}

class Musician extends Dancer,Singer {
void showTime() {
perform();
}
}




혼란스럽죠?

이것은 컴파일러가이 코드를 실행하려고 할 때 느끼는 것입니다. 

호출 할 올바른 방법이 무엇인지 결정할 실제 방법이 없기 때문입니다. 

이 상황은 죽음의 치명적인 다이아몬드(DDD)로 알려져 있으며 다중 상속의 핵심적인 문제입니다. 고맙게도 mixins를 사용하여이 문제를 해결할 수 있습니다.




What mixin can do for us?


공식적인 문서로서 :


"믹스 인을 구현하려면 Object를 확장하고 생성자를 선언하지 않는 클래스를 만듭니다. 믹스 인을 일반 클래스로 사용하지 않으려면 클래스 대신 mixin 키워드를 사용하십시오. "



mixin 키워드는 dart 2.1에서 소개되었으며, 어떤면에서는 추상 클래스와 유사하고 다른면에서는 다른 점이 다릅니다. 추상 클래스처럼, 당신은 믹스 인에서 추상적 인 메소드를 선언 할 수 있고 그것을 인스턴스화 할 수 없습니다. 그러나 추상과는 달리 믹스 인을 확장 할 수는 없습니다.


키워드 mixin, 추상 클래스 또는 일반 클래스를 mixin으로 사용할 수 있습니다. mixins로 위의 문제를 해결할 수있는 방법에 대해 살펴 보겠습니다.


mixin은 다중 상속이 아니라 항상 확장을 필요로하지 않고 여러 계층의 클래스에서 코드를 재사용하는 방법 일뿐입니다. 그것은 아이들없이 다른 사람들의 자산을 사용할 수있는 것 같습니다.


먼저 

perform () 메소드를 가지는 Performer 클래스를 만들어야합니다.

perform () 메서드를 가지는 Dancer 클래스를 만듭니다.

동일한 perform () 메서드를 가지는 Singer 클래스를 만듭니다.

Performer 클래스와 함께 이 두 클래스를 모두 사용하는 Musician 클래스를 하나 더 만듭시다.


class Performer {
void perform() {
print('performing...');
}
}

mixin Dancer {
void perform() {
print('Dance...Dance...Dance..');
}
}

mixin Singer {
void perform() {
print('lalaaa..laaalaaa....laaaaa');
}
}

class Musician extends Performer with Dancer, Singer {
void showTime() {
perform();
}
}

main(List<String> args) {
Musician m = Musician();

m.perform();
}



[실행결과]

lalaaa..laaalaaa....laaaaa 



클래스를 혼합 할 때, mixins로 사용되는 클래스는 평행하지 않고 대신 클래스를 사용합니다. 이것이 메소드가 서로 상충되지 않는 이유이며, 다중 상속의 취약점을 다루지 않고도 여러 클래스의 코드를 사용할 수 있습니다.


만약 당신이 혼란스러워한다면, 당황하지 말고 믹스 인이 어떻게 평가되는지 설명하겠습니다.


믹스 인을 사용할 때 실행될 클래스 메서드를 결정하려면 다음과 같은 간단한 단계를 따르십시오.



mixins를 사용하는 클래스가 어떤 클래스를 확장하고 있다면 그 클래스를 스택 맨 위에 놓으십시오.

  class Musician extends Performer


믹스 인을 선언하는 순서를 항상 기억하십시오. 이것은 어떤 클래스가 더 중요한지 결정하기 때문에 매우 중요합니다. 믹스 인이 동일한 메소드를 포함하고 있다면 나중에 선언 된 믹스 인 클래스가 실행될 것입니다 (다른 하나가 "중요성"을 높이면 믹스 인을 선언합니다).


예제에서는 Dancer를 Singer 앞에 선언했습니다. 이것이 더 중요하기 때문에 Performer 보다 낮게 됩니다.

  class Musician extends Performer with Dancer


Dancer 다음에 Singer를 선언했으므로 스택에 Singer가 Dancer 밑에 있게 된다.


마지막으로 믹스인을 사용하는 클래스(Musician) 스택에 추가합니다.

이 클래스는 구체적입니다. 만약 믹스인이나 상위클래스에 동일 한 메소드가 있다면 이 클래스의 메소드가 먼저 불릴 것입니다.




믹스인이 코드재사용을 위해 다중상속고 그로 인한 문제를 피하는 방법을 알아 보았습니다. 이제 믹스인으로 할 수 있는 고급기능에대해 알아보겠습니다.



믹스인으로 더 많은 것을.

다트의 믹스인을 사용해 여러가지 기능을 사용할 수 있지만. 살펴볼만한 중요한 키워드가 있습니다. on은 믹스인의 사용을 선언된 클래스를 확장하거나 구연하는 클래스로만 제한하는데 사용됩니다. on 키워드를 사용하려면 mixin 키워드를 사용해서 믹스인을 선언해야합니다.


다음은 on키워드를 사용하는 예입니다.


class A {}

class B {}

mixin X on A {}

mixin Y on B {}

class p extends A with X {}

class Q extends B with Y {}


위 코드에서 믹스인들(X,Y)는 A와 B을 구현하거나 확장하는 클래스에서만 사용하도록 제한합니다.



결론


믹스인의 뿌리는 Lisp 커뮤니티와 smalltalk에 대한 첫 번째 용도에서 찾을 수 있습니다. 다트는 다양한 방식으로 스몰 토크의 영향을받습니다. 믹스인은 여러 클래스 계층 구조에서 제한없이 코드를 재사용 할 수있는 좋은 방법입니다. 



출처 : https://medium.com/flutter-community/https-medium-com-shubhamhackzz-dart-for-flutter-mixins-in-dart-f8bb10a3d341




'flutter' 카테고리의 다른 글

Dart mixin 이란?  (0) 2019.04.03
RxDart 관련 내용들  (0) 2019.03.29
Flutter - 스트림. 다트에서 비동기 프로그래밍  (0) 2019.03.27
플러터로 예쁜 UI 만들기  (0) 2019.03.21
Flutter Stream  (0) 2019.03.20