카테고리 없음
[Dart] Class3 - abstract class / Inheritance / Mixins
노트포미
2024. 7. 17. 00:43
1. Abstract Class(추상화 클래스)
: 다른 클래스들이 직접 구현해야 하는 메소드들을 모아 놓은 blueprint(청사진 = 도면?)
- 추상화 클래스로는 객체를 생성할 수 없다
- extends 키워드로 다른 클래스에 상속하여 사용
- A클래스가 추상화클래스B를 상속 받았는데 B에 정의된 method를 A에 정의하지 않으면, 에러
- 추상화클래스B를 상속받은 A클래스 내에서 method를 변형할 수 있다.(반환형,이름만 동일하게)
//추상화 클래스 정의
abstract class Human {
void talk();
}
//extends 키워드로 Human 상속
class Player extends Human {
String name;
int xp;
Player({
required this.name,
required this.xp,
});
//Human에 정의된 talk()를 구현하지 않으면 컴파일 에러
void talk() {
print('talk method called in Player $name');
}
}
2. Inheritance(상속)
: 자식 클래스가 부모 클래스의 특성과 기능을 그대로 물려받는 것
- 자식 클래스 선언에 extends 키워드 사용
- 자식 클래스에서 부모클래스를 지칭하는 키워드 : super
- 자식 클래스에서는 부모클래스의 생성자(constructor)를 호출해야 한다
- 자식 클래스에서 부모클래스의 property, method를 사용할 수 있다
class Human {
final String name;
Human(this.name);
void sayHello() {
print("Hello my name is $name");
}
}
//Human클래스를 상속받는 Player클래스
//Human의 method, property사용 가능
//Human의 생성자 호출 필요
class Player extends Human {
final String team;
//부모 클래스는 super로 호출
//부모 클래스인 Human생성자에 name을 전달하는 과정
Player({
required this.team,
required String name,
}) : super(name);
}
void main() {
var player = Player(
team: 'red',
name: 'abc',
);
//상속받은 sayHello() 사용가능
player.sayHello();
}
2-1. override(대체)
: 부모클래스에게 상속받은 method의 body를 수정할 수 있다.
- @override 키워드 사용
class Human {
final String name;
Human(this.name);
//기본 sayHello
void sayHello() {
print("Hello my name is $name");
}
}
class Player extends Human {
final String team;
//부모 클래스는 super로 호출
//부모 클래스인 Human생성자에 name을 전달하는 과정
Player({
required this.team,
required String name,
}) : super(name);
//상속받은 Human의 sayHello()를 Player클래스에 맞게 수정
@override
void sayHello() {
super.sayHello();
print("I'm in $team team");
}
}
void main() {
var player = Player(
team: 'red',
name: 'abc',
);
player.sayHello();
//output : Hello my name is abc
// I'm in red team
}
3. Mixins
: 상속과 비슷하게 다른 클래스의 property, method를 사용할 수 있게 하는 것
- mixin 키워드 사용 (이전에는 class로도 가능했음)
- 생성자는 없음
Inheritance(상속) | mixin | |
공통점 | - property, method를 사용할 수 있다. - 다른 클래스에 재사용 가능하다. |
|
키워드 | extends | with |
여러개 | 다중상속X | 여러개 가능 |
생성자 | 있음 -> 자식 클래스에서 호출 필요 | 없음 |
//Mixin은 생성자가 없다
mixin Strong {
double power = 100.99;
}
mixin QuickRunner {
void runQuick() {
print("ruuuuuuun!");
}
}
class Parent {
String parent;
Parent(this.parent);
}
class Daddy {
String dad;
Daddy(this.dad);
}
//상속 키워드인 extends대신, with 키워드 사용
class Player with Strong, QuickRunner {
//Strong의 power사용 가능
}
//다른 클래스에도 재사용 가능
class Kid with QuickRunner {}
void main() {
//with로 연결된 QuickRunner의 메소드 runQuick() 사용 가능
var player = Player();
player.runQuick();
var kid = Kid();
kid.runQuick();
}