본문 바로가기

플러터&어플리케이션

flutter 상속, 추상 클래스, 믹스인

*implement :

class, abstract class 상속 필수구현

다중상속 가능

 

*extends :
class 상속 선택구현, abstract class 면 상속 필수구현,

다중상속 불가능

 

*with : 상속 X, 기능을 가져오거나 오버라이드 가능

 

*상속 override 생략가능

 

예시)

가능 class Class1 implements Abstract1, Abstract2, Abstract3{}

불가능 class Class1 extends Abstract1, Abstract2, Abstract3{}

가능 class Class2 extends Abstract1 implements Abstract2, Abstract3{}

불가능 class Class2 implements Abstract2, Abstract3 extends Abstract1{}

가능 class Class1 implements Abstract1, Abstract2, Abstract3 with Class2, Class3

가능 class Class2 extends Abstract1 implements Abstract2, Abstract3 with Class2, Class3

 

정리)

extends는 속성이나 메소드들도 모두 상속받기 때문에 하위 클래스에서 부모 클래스의 메소드들을 특별한 구현없이 바로 사용 가능.

implements는 여러 부모 클래스를 가질 수 있었지만, 인터페이스의 구현과 마찬가지로 하위 클래스에서 모든 메소드를 오버라이딩으로 구현 필수.

with는 여러 개의 부모 클래스를 가질 수 있으며, 각 메소드를 일일이 구현하지 않더라도 부모에서 구현된 메소드 호출을 할 수 있음.

 

1.상속

상속을 주는쪽 슈퍼클래스(부모클래스)

상속을 받는쪽 서브클래스(자식클래스)

class SuperClass{
  String name = 'Super';
  
  void run(){
    print('superclass run');
  }
}

class SubClass extends SuperClass{
  
  String name = 'Sub';

  @override
  void run(){
    super.run();
    this.fly();
  }
  
  void fly(){
    print('subclass fly');
  }
}

void main() {
  
  var superClass = SuperClass();
  superClass.run();
  print(superClass.name);
  
  print('------------------');
  
  var subClass = SubClass();
  subClass.run();
  subClass.fly();
  print(subClass.name);
  
}

결과

2.추상 클래스

추상 클래스는 추상 메서드를 포함하는 클래스입니다.

추상 메서드는 선언만 되고 정의가 없는 메서드입니다.

 

추상클래스는 그대로 인스턴스화할 수 없으며 다른 클래스에서 임플리먼트하여 기능을 완성하는 상속 재료로 사용됩니다.

 

abstract class Abstract{
  void method1();
}

class Class1 implements Abstract{
  @override
  void method1(){
    print('Class1 method1');
  }
}

class Class2 implements Abstract{
  @override
  void method1(){
    print('Class2 method1');
  }
}

void main() {
  var class1 = Class1();
  class1.method1();
  
  var class2 = Class2();
  class2.method1();
}

 결과

3.믹스인

class Class1{
  void method1(){
    print('Class1 method1 run');
  }
}

class Class2{
  void method2(){
    print('Class2 method2 run');
  }
}

class Class3{
  void method3(){
    print('Class3 method3 run');
  }
}

class Class4 extends Class1 with Class2, Class3{

  @override
  void method1(){
    print('Class4 method1 run');
  }
  
  @override
  void method2(){
    print('Class4 method2 run');
  }
}


void main() {  
  var class4 = Class4();
  class4.method1();
  class4.method2();
  class4.method3();
}

결과

 

추상화 추가샘플

abstract class Animal{
  int age;
  String name;
  
  void talk();
  
  void growl() => print('grrrr');
}

class Cat implements Animal{
  @override
  int age;
  @override
  String name;
  
  @override
  void talk(){
    print('Cat talk');
  }
  
  @override
  void growl(){
    print('Cat growl');
  }
}

class Dog implements Animal{
  @override
  int age;
  @override
  String name;
  
  @override
  void talk(){
    print('Dog talk');
  }
  
  @override
  void growl(){
    print('Dog growl');
  }
}

void makeAnimalNoise(Animal animal) => animal.talk();

void main() {
  var cat = Cat();
  cat.talk();
  var dog = Dog();
  dog.talk();
  
  makeAnimalNoise(cat);
  makeAnimalNoise(dog);
}

믹스인 샘플

class Employee{
  Employee(){}
  
  void test(){
    print('tt');
  }
}

mixin Medical{
  void test(){
    print('tt');
  }
}

mixin Medical2{
  void test(){
    print('ttt');
  }
}

class Nurse extends Employee with Medical, Medical2{

}

void main() {
  var nurse = Nurse();
  nurse.test();
}