Flutter & Dart

Dart 상속

까칠코더 2023. 11. 17. 09:40
반응형

부모 클래스를 상속할때에는 extends를 사용합니다.

class ParentClass {
  int value;
  ParentClass(this.value);
}

class ChildClass extends ParentClass {
  ChildClass(int value) : super(value) { } 
}

class Child2Class extends ParentClass {
  Child2Class(super.value);
}

추상 클래스는 abstract를 사용해서 정의하며, (JAVA에서는 인터페이스, Swift에서는 프로토콜과 유사합니다)
추상함수만 제공함으로써 실제 상속받는 클래스에서 구현부를 제공하도록 하게 합니다. 

abstract class User {
  void printName();
}

class Customer extends User {
  String name;
  Customer(this.name) { }

  @override
  void printName() {
    print('name = $name');
  }
}

Customer('zzz').printName(); // name = zzz

다른 클래스를 암시적 인터페이스로 사용하기 위해서는 implements를 사용하며, 부모 클래스의 모든 멤버 변수를 재정의 해줘야 합니다.

class User {
  String name;
  int age;
  
  User(this.name, this.age);
  String greet(String guest) => 'Hello, $guest, I\'m $name, and $age years old';
}

class Customer implements User {
  String name = 'abc';
  int age = 10;
  
  @override
  String greet(String guest) {
    return 'Hello, $guest';
  }
} 

// How to use
User user = Customer();
print('Say ${user.greet('zzz')}'); // Say Hello, zzz

멤버를 공유하기 위해 class 대신에 mixin 을 사용하는 방법이 있습니다. 이를 상속받기 위해서는 extends 대신에  with라는 사용합니다.

또한 mixin으로 선언할때 on 키워드를 사용해서 특정 클래스에서만 상속받을 수 있도록 할 수 있습니다.

mixin User {
  String name = 'abc';
  
  void printName() {
    print('name = $name');
  }
}

class Guest { 
}

mixin User2 on Guest {
  String name = 'aaa';
  
  void printName() {
    print('name = $name');
  }
}

class Customer with User {
  void say() {
    printName();
  }
}

class MyGuest extends Guest with User2 {
  void say() {
    printName();
  }
}

// How to use
var user = Customer();
user.say(); // name = abc
user.name = 'zzz';
user.say(); // name = zzz

var guest = MyGuest();
guest.say();
반응형