티스토리 뷰
믹스인은 여러 클래스 계층에서 재사용할 수 있는 코드를 정의하는 방법이다. 믹스인은 멤버 구현을 대량으로 제공하는 데 사용된다.
믹스인을 사용하려면 with 키워드를 사용해서 하나 이상의 믹스인 이름을 작성한다. 믹스인을 사용하는 클래스는 상속도
다음 예제는 믹스인으로 사용하는 두 클래스를 보여준다.
class Musician extends Performer with Musical {
// ···
}
class Maestro extends Person with Musical, Aggressive, Demented {
Maestro(String maestroName) {
name = maestroName;
canConduct = true;
}
}
믹스인을 정의하려면 mixin 선언을 사용하자. 믹스인과 클래스를 모두 정의해야 하는 경우에는 mixin class 선언을 사용할 수 있다. 믹스인과 믹스인 클래스는 extends 절을 가질 수 없으며, 생성 생성자를 선언해서는 안된다.
mixin Musical {
bool canPlayPiano = false;
bool canCompose = false;
bool canConduct = false;
void entertainMe() {
if (canPlayPiano) {
print('Playing piano');
} else if (canConduct) {
print('Waving hands');
} else {
print('Humming to self');
}
}
}
믹스인이 호출할 수 있는 멤버 지정
믹스인은 메서드를 호출하거나 필드에 접근할 수 있다. 하지만 믹스인은 생성자가 없기 때문에 자신의 필드를 인스턴스화할 수 없다. 그래서 믹스인의 동작이 의존하는 멤버를 모든 서브 클래스가 정의하도록 보장하는 전략을 사용한다.
믹스인에서 추상 멤버 정의
믹스인에서 추상 메서드를 선언하면 믹스인을 사용하는 모든 타입이 해당 메서드를 정의하도록 한다.
mixin Musician {
// 추상 메서드
void playInstrument(String instrumentName);
void playPiano() {
playInstrument('Piano');
}
void playFlute() {
playInstrument('Flute');
}
}
class Virtuoso with Musician {
// 서브 클래스에서 정의
void playInstrument(String instrumentName) {
print('Plays the $instrumentName beautifully');
}
}
믹스인의 서브클래스에서 상태 접근
추상 멤버를 선언하면, 믹스인의 서브 클래스에서 게터를 호출하여 상태에 접근할 수 있다. 게터는 믹스인에서 추상으로 정의된다.
/// [name] 속성이 있는 모든 타입에 적용할 수 있으며,
/// 이를 기반으로 [hashCode]와 `==` 연산자의 구현을 제공합니다.
mixin NameIdentity {
String get name;
int get hashCode => name.hashCode;
bool operator ==(other) => other is NameIdentity && name == other.name;
}
class Person with NameIdentity {
final String name;
Person(this.name);
}
인터페이스 구현
믹스인을 추상으로 선언하는 것과 유사하게, implements 절을 믹스인에 추가하면 실제로 인터페이스를 구현하지 않고, 믹스인의 모든 멤버 의존성을 정의하도록 할 수 있다.
abstract interface class Tuner {
void tuneInstrument();
}
mixin Guitarist implements Tuner {
void playSong() {
tuneInstrument();
print('Strums guitar majestically.');
}
}
class PunkRocker with Guitarist {
void tuneInstrument() {
print("Don't bother, being out of tune is punk rock.");
}
}
on 절을 사용하여 슈퍼클래스 선언
on 절은 믹스인 내부에서 super 호출이 필요할 때 사용한다. on 절은 믹스인을 사용하는 모든 클래스가 on 절에 작성한 타입의 서브 클래스가 되도록 강제한다. 믹스인이 슈퍼 클래스의 멤버에 의존하는 경우, on 절로 인해서 믹스인이 사용하는 서브 클래스에서 슈퍼 클래스의 멤버가 사용 가능함을 보장한다.
다음 예제에서 MusicialPerformer 믹스인은 Musician의 서브 클래스에서만 사용할 수 있게 했다. 그래서 SingerDancer는 Musician을 확장하므로 MusicialPerformer 믹스인을 사용할 수 있다.
class Musician {
musicianMethod() {
print('Playing music!');
}
}
mixin MusicalPerformer on Musician {
performerMethod() {
print('Performing music!');
super.musicianMethod();
}
}
class SingerDancer extends Musician with MusicalPerformer { }
main() {
SingerDancer().performerMethod();
}
class, mixin 또는 mixin class?
mixin class는 다트 3.0부터 사용할 수 있게 되었다.
mixin 선언은 믹스인을 정의한다. class 선언은 클래스를 정의한다. mixin class 선언은 class와 mixin을 모두 사용할 수 있는 타입으로 정의하는 것이다.
mixin class Musician {
// ...
}
class Novice with Musician { // Musician을 믹스인으로 사용
// ...
}
class Novice extends Musician { // Musician을 클래스로 사용
// ...
}
클래스와 믹스인에 적용되는 제한 사항은 믹스인 클래스에도 적용된다.
- 믹스인은 extends와 with절을 가질 수 없으므로, 믹스인 클래스도 가질 수 없다.
- 클래스는 on 절을 가질 수 없으므로, 믹스인 클래스도 가질 수 없다.
'다트 공식 문서 번역' 카테고리의 다른 글
다트] 확장 메서드 (0) | 2024.08.04 |
---|---|
다트] 열거형 타입 (enum) (0) | 2024.08.04 |
다트] 클래스를 확장하기 (0) | 2024.08.03 |
다트] 메서드 (0) | 2024.08.01 |
다트] 생성자 (0) | 2024.08.01 |