믹스인의 on 키워드
Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 110개 중 53번째.
때때로 믹스인은 자신이 믹스인되는 클래스의 메서드나 속성을 사용해야 할 때가 있습니다. on 키워드를 사용하면 특정 타입을 상속하는 클래스에서만 믹스인을 사용할 수 있도록 제한할 수 있습니다.
class Animal {
String name;
Animal(this.name);
void breathe() => print('$name is breathing');
}
mixin Swimming on Animal {
void swim() {
print('$name is swimming'); // Animal의 'name'에 접근할 수 있습니다
breathe(); // Animal의 메서드를 호출할 수 있습니다
}
}
class Fish extends Animal with Swimming {
Fish(String name) : super(name);
}on Animal 선언은 이 믹스인이 Animal을 확장하는 클래스에만 적용될 수 있음을 의미합니다. 이는 믹스인이 Animal의 멤버에 접근할 수 있음을 보장합니다. on이 없으면, 믹스인은 name이나 breathe()가 존재하는지 알 수 없습니다.
제한된 믹스인을 호환되지 않는 클래스에 사용하려고 하면, Dart는 컴파일 타임 오류를 발생시킵니다:
class Robot with Swimming {} // 오류! Robot이 Animal을 상속하지 않습니다이 제약 조건은 믹스인(mixin)의 기능이 기본 클래스의 특정 기능에 의존할 때 유용합니다. 이는 더 안전한 계약을 생성합니다. 즉, 믹스인은 특정 동작을 보장하지만, 올바르게 작동하는 데 필요한 기반이 갖춰진 경우에만 해당됩니다.
챌린지
쉬움on 키워드가 믹스인(mixin)을 특정 베이스 클래스에서만 작동하도록 제한하는 방법을 보여주는 차량 시스템을 구축해 보겠습니다. 터보 부스트 기능을 추가하는 믹스인을 만들되, 이 믹스인은 Vehicle 베이스 클래스를 상속받는 클래스에서만 사용할 수 있도록 제한할 것입니다.
코드를 두 개의 파일로 구성합니다:
vehicles.dart: 베이스 클래스, 제한된 믹스인, 그리고 차량 타입을 여기에 정의합니다:String model속성과int speed속성을 가진Vehicle클래스. 두 값을 모두 받는 생성자를 포함하세요.[model] accelerating to [speed] km/h를 출력하는accelerate()메서드를 추가하세요.on키워드를 사용하여Vehicle로 제한된TurboBoost믹스인. 이 믹스인은[model] TURBO ACTIVATED!를 출력한 다음accelerate()를 호출하는activateTurbo()메서드를 가져야 합니다 (두 요소 모두on Vehicle제약 조건 덕분에 접근 가능합니다).Vehicle을 상속받고TurboBoost믹스인을 사용하는SportsCar클래스.String color속성을 추가하세요. 생성자는 model, speed, color를 인자로 받아야 합니다.[color] [model] ready to race!를 출력하는showOff()메서드를 포함하세요.
main.dart: vehicles 파일을 임포트하고 제한된 믹스인이 어떻게 작동하는지 보여줍니다:- model은
'Ferrari', speed는320, color는'Red'인SportsCar를 생성합니다. showOff()를 호출합니다.activateTurbo()를 호출합니다.
- model은
TurboBoost 믹스인은 on Vehicle 선언을 통해 Vehicle을 상속받는 클래스에만 믹스인될 것임을 보장받기 때문에 model에 접근하고 accelerate()를 호출할 수 있습니다. 이는 믹스인이 어떤 기능을 사용할 수 있는지 정확히 알고 있는 안전한 계약을 생성합니다.
예상 출력:
Red Ferrari ready to race!
Ferrari TURBO ACTIVATED!
Ferrari accelerating to 320 km/h치트 시트
on 키워드는 믹스인(mixin)을 특정 타입을 상속하는 클래스에서만 사용할 수 있도록 제한합니다. 이를 통해 믹스인은 기본 클래스의 메서드와 속성에 안전하게 접근할 수 있습니다.
class Animal {
String name;
Animal(this.name);
void breathe() => print('$name is breathing');
}
mixin Swimming on Animal {
void swim() {
print('$name is swimming'); // Animal의 'name'에 접근 가능
breathe(); // Animal의 메서드 호출 가능
}
}
class Fish extends Animal with Swimming {
Fish(String name) : super(name);
}on Animal 선언은 믹스인이 Animal의 멤버에 접근할 수 있음을 보장합니다. 이것이 없으면 믹스인은 name이나 breathe()가 존재하는지 알 수 없습니다.
호환되지 않는 클래스에서 제한된 믹스인을 사용하려고 하면 컴파일 타임 에러가 발생합니다:
class Robot with Swimming {} // 에러! Robot은 Animal을 상속하지 않습니다이 제약 조건은 믹스인의 기능이 기본 클래스의 특정 기능에 의존할 때 유용하며, 믹스인과 이를 사용하는 클래스 사이에 더 안전한 계약을 생성합니다.
직접 해보기
import 'vehicles.dart';
void main() {
// TODO: model 'Ferrari', speed 320, color 'Red'인 SportsCar를 생성하세요
// TODO: showOff()를 호출하세요
// TODO: activateTurbo()를 호출하세요
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.