다중 인터페이스
Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 110개 중 48번째.
인터페이스가 상속보다 갖는 가장 큰 장점 중 하나는 클래스가 여러 인터페이스를 구현할 수 있다는 점입니다. Dart는 오직 하나의 클래스만 확장하도록 제한하지만, 인터페이스는 필요한 만큼 얼마든지 구현할 수 있습니다.
abstract class Printable {
void printContent();
}
abstract class Saveable {
void save();
}
abstract class Shareable {
void share(String recipient);
}
class Document implements Printable, Saveable, Shareable {
String content;
Document(this.content);
@override
void printContent() {
print('Printing: $content');
}
@override
void save() {
print('Saving document...');
}
@override
void share(String recipient) {
print('Sharing with $recipient');
}
}여러 인터페이스를 구현할 때, 모든 인터페이스의 모든 메서드에 대한 구현을 제공해야 합니다. 클래스는 지원하기로 약속한 모든 계약을 이행해야 합니다.
또한 extends를 여러 개의 implements와 결합할 수 있습니다:
class Report extends Document implements Printable, Shareable {
Report(String content) : super(content);
// 여전히 모든 인터페이스 메서드를 구현해야 합니다
// (이 경우에는 이미 Document로부터 상속받았습니다)
}이러한 유연성을 통해 여러 역할을 수행하는 클래스를 설계할 수 있습니다. SmartPhone은 Camera, Phone, 그리고 MusicPlayer 인터페이스를 구현할 수 있으며, 각 인터페이스가 요구하는 모든 기능을 수행할 수 있음을 보장하면서도 자신만의 고유한 구현을 유지할 수 있습니다.
챌린지
쉬움단일 클래스가 여러 인터페이스를 구현하여 서로 다른 기능을 결합하는 방법을 보여주는 스마트 기기 시스템을 구축해 보겠습니다. 서로 다른 기기 기능을 위한 별도의 인터페이스 클래스를 만든 다음, 그 모든 기능을 수행할 수 있는 기기를 만들어 볼 것입니다.
코드를 두 개의 파일로 구성합니다:
devices.dart: 여기에 인터페이스와 구현 클래스를 정의합니다:Connecting to network...를 출력하는connect()메서드를 가진Connectable클래스Charging battery...를 출력하는charge()메서드를 가진Chargeable클래스Displaying: [content]를 출력하는showScreen(String content)메서드를 가진Displayable클래스Connectable,Chargeable,Displayable세 가지 인터페이스를 모두 구현하는Tablet클래스. 생성자와 함께String brand속성을 추가하세요. 구현부에서는 connect의 경우[brand] tablet connecting to WiFi를, charge의 경우[brand] tablet charging via USB-C를, showScreen의 경우[brand] screen: [content]를 출력해야 합니다.
main.dart: devices 파일을 임포트하고 Tablet이 세 가지 인터페이스 계약을 어떻게 모두 충족하는지 보여줍니다:- brand가
'Galaxy'인Tablet을 생성합니다. connect()를 호출합니다.charge()를 호출합니다.showScreen('Welcome Home')을 호출합니다.
- brand가
Tablet 클래스는 세 가지 인터페이스의 모든 메서드에 대해 자체적인 구현을 제공해야 합니다. 이는 여러 인터페이스를 구현함으로써 단일 클래스가 여러 기능을 약속하는 동시에 각 구현을 기기에 맞게 고유하게 유지하는 방법을 보여줍니다.
예상 출력:
Galaxy tablet connecting to WiFi
Galaxy tablet charging via USB-C
Galaxy screen: Welcome Home치트 시트
클래스는 implements 키워드 뒤에 쉼표로 구분하여 나열함으로써 여러 인터페이스를 구현할 수 있습니다:
abstract class Printable {
void printContent();
}
abstract class Saveable {
void save();
}
class Document implements Printable, Saveable {
@override
void printContent() {
print('Printing...');
}
@override
void save() {
print('Saving...');
}
}여러 인터페이스를 구현할 때, 모든 인터페이스의 모든 메서드에 대한 구현을 제공해야 합니다.
extends를 여러 개의 implements와 결합할 수 있습니다:
class Report extends Document implements Printable, Shareable {
Report(String content) : super(content);
// 모든 인터페이스 메서드를 구현해야 합니다
}이를 통해 클래스는 여러 계약을 충족하고 동시에 여러 역할을 수행할 수 있습니다.
직접 해보기
import 'devices.dart';
void main() {
// TODO: 브랜드가 'Galaxy'인 Tablet 생성
// TODO: connect() 호출
// TODO: charge() 호출
// TODO: showScreen('Welcome Home') 호출
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.