다이아몬드 문제
Father, Mother 클래스는 Person 클래스를 상속 받고 Child 클래스는 Father, Mother 클래스를 상속 받는 상황
이때, Child는 Person의 속성과 메서드를 어떠한 경로를 통해 상속 받아야 하는지 명확하지 않는다는 점이 다중 상속의 문제점이다.
왜 명확하지 않으면 안 될까요?
Person 클래스의 메서드를 Father, Mother 클래스에서 재정의를 했다고 가정한다. Child에서 메서드를 사용한다면 Father과 Mother중에서 어떤 클래스에 있는 메서드를 사용해야 하는지 모른다.
mixin Speaker {
void speak() {
print('Person is speaking');
}
}
class Father with Speaker {
@override
void speak() {
print('Father is speaking');
}
}
class Mother with Speaker {
@override
void speak() {
print('Mother is speaking');
}
}
class Child extends Father with Mother {
// Child 클래스는 Father와 Mother의 기능을 모두 가져올 수 있습니다.
// Mother의 기능이 더 우선순위를 가집니다.
}
void main() {
Child child = Child();
child.speak(); // Mother is speaking
}
class Person {
void speak() {
print('Person is speaking');
}
}
mixin Speaker on Person {
@override
void speak() {
super.speak(); // Person 클래스의 speak 메서드를 호출합니다.
print('and the speaker is speaking too');
}
}
class Father extends Person with Speaker {
@override
void speak() {
super.speak(); // 믹스인의 speak 메서드를 호출합니다.
}
}
void main() {
Father father = Father();
father.speak(); // 출력: Person is speaking
// and the speaker is speaking too
}
Mixin은 공동 기능 재사용 하는 상황에 많이 쓰인다.
ex) 로깅(기록), 애니메이션 기능
//<ExtensionName>: 확장의 이름
//<T>: 제네릭 타입 파라미터
//<Type>: 확장이 적용될 타입
extension <ExtensionName><T> on <Type> {
//확장 메서드들
}
Generic 타입이란?
class ClassName<T>{
//클래스 구현
}
Mixin | Extension | |
---|---|---|
사용 목적 | 여러 클래스에 공통 기능 주입 | 기존 클래스에 메서드 추가 |
포함 가능 요소 | 메서드, 속성 | 메서드 |
속성 추가 | 가능 | 불가능 |