강의: #4.7 Abstract Classes
강의: #4.8 Inheritance
강의: #4.9 Mixins
추상화 클래스로는 객체를 생성할 수 없다. 추상화 클래스는 다른 클래스들이 직접 구현해야하는 메소드들을 모아놓은 일종의 청사진(blueprint)이라 보면된다.
추상화 클래스는 다른 클래스들이 어떤 청사진을 가지고 있어야 하는지 정의해주기 때문에 유용하다.
Human이라는 추상화 클래스는 walk라는 메소드를 가지고 이 메소드는 void를 반환해야 한다고 표시.
수많은 청사진에 메소드의 이름과 반환타입만 정해서 정의할 수 있다. 파라미터도 설정 가능하고 다른 클래스에서 extends(상속,확장)할 수 있다.
추상화 클래스는 특정 메소드를 구현하도록 강제한다.
Human 추상화 클래스는 이를 상속받는 모든 클래스가 가지고 있어야하는 메소드를 정의하고 있다.
abstract class Human {
void walk();
}
enum Team { red, blue }
enum XPLevel { beginner, medium, pro }
//Human 클래스를 상속받는 Player 클래스를 만들었다.
class Player extends Human{
String name;
XPLevel xp;
Team team;
Player({
required this.name,
required this.xp,
required this.team,
});
void walk(){
print('im walking');
}
void sayHello(){
print("Hi my name is $name");
}
}
class Coach extends Human{
void walk(){
print('the coach is walking');
}
}
void main() {
var nico = Player(name: "nico", xp: XPLevel.beginner , team: Team.red)
..name = 'las'
..xp = XPLevel.pro
..team = Team.blue;
}
상속을 하고 super를 이용해 부모 클래스의 생성자를 호출할 수 있다.
@override를 이용해 부모 클래스의 객체를 받아올 수 있다.
class Human {
final String name;
Human(this.name);
void sayHello(){
print("Hi my name is $name");
}
}
enum Team {blue, red}
class Player extends Human{
final Team team;
//Human 클래스의 생성자 함수의 호출,
//named argument를 사용하는 Player의 생성자 함수
Player({
required this.team,
required String name
}) : super(name);
void sayHello(){
super.sayHello();
//확장(상속)한 부모 클래스의 프로퍼티에 접근하게 하거나 메소드를 호출할 수 있게 해줌
//super라는 키워드를 통해 확장한 부모 클래스와 상호작용할 수 있게 해줌
print('and I play for ${team}');
}
}
void main() {
var player = Player(team: Team.red,
name: 'nico',
);
player.sayHello();
Mixin은 생성자가 없는 클래스를 의미. 클래스에 프로퍼티들을 추가할 때 사용함.
Mixin 클래스들을 하나의 클래스에 단 한번만 사용할 것 같으면 의미가 없음.
Mixin의 핵심은 여러 클래스에 재사용이 가능하다는 점.
extend랑은 다름, extend를 하게 되면 확장한 그 클래스는 부모 클래스가 되는거고,
자식 클래스는 부모 클래스를 super를 통해서 접근할 수 있다. 그 순간 부모 클래스의 인스턴스가 된다.
Mixin은 with라는 키워드를 사용해서 단순히 Mixin내부의 프로퍼티와 메소드들을 가져오는 것 뿐이다. 한마디로 뺏어오는 것이라 보면된다. 단, Mixin의 조건은 생성자가 없는 클래스여야 한다.
^오^