void main(){
final perant = Parent(id: 1);
print(perant.id);
final child = Child(id: 3);
print(child.id);
}
class Parent{
final int id;
Parent({
required this.id,
});
}
class Child extends Parent{
Child({
required super.id,
});
}
- Parent 클래스와 Parent를 상속하고 있는 child클래스를 생성해서 인스턴스화하고 각각 id에 값을 넣어줬다.
- 각각 print하면 1, 3을 반환하게 된다.
Factory constructor 사용
void main(){
final perant = Parent(id: 1);
print(perant.id);
final child = Child(id: 3);
print(child.id);
final parent2 = Parent.fromInt(5);
print(parent2.id);
}
class Parent{
final int id;
Parent({
required this.id,
});
factory Parent.fromInt(int id){
return Parent(id: id);
}
}
class Child extends Parent{
Child({
required super.id,
});
}
1
3
5
- factory에 일반 생성자를 생성하듯이 사용하면 된다.
- 일반 생성자와 다른점이라면
(){}
함수 body가 있다.
- 현재 class의 인스턴스를 반환해줘야 한다. 위에 경우를 보면 Parent를 반환해줘야 한다.
- factory Parent 생성자와 Parent 클래스 생성자 이름이 같아 에러가 발생한다. 이때 named constructor를 사용해서 fromInt를 작성해준다.
Factory constructor
를 선언해서 사용해보면 5가 출력된다.
final parent2 = Parent.fromInt(5);
print(parent2.id);
5
특징
- 현재 클래스만 인스턴스해서 반환해준다. Parent를 선언했는데 Child가 반환되거나 Child를 선언했는데 Parent가 반환되는 일은 없다.
- 하지만
Factory constructor
에서는 자식 클래스인 Child를 반환해도 상관이 없다.
void main(){
final perant = Parent(id: 1);
print(perant.id);
final child = Child(id: 3);
print(child.id);
final parent2 = Parent.fromInt(5);
print(parent2.id);
}
class Parent{
final int id;
Parent({
required this.id,
});
factory Parent.fromInt(int id){
return Child(id: id);
}
}
class Child extends Parent{
Child({
required super.id,
});
}
1
3
5
- 출력해보면 이전과 결과값의 변동이 없다.
- parent2의 타입을 출력해보면
Child
가 나오는 것을 볼 수 있다.
print(parent2);
Instance of 'Child'
- 따라서
factory constructor
를 사용하게 되면 현재 클래스를 반환하는 것은 물론 현재 클래스를 상속하고 있는 클래스를 인스턴스화해서 반환할 수 있다.