[Dart] extends VS implements VS with(Mixins)

김영진·2021년 6월 13일
1

Dart

목록 보기
2/2

목적

extends, implements 자바를 공부할때 인터페이스 상속시 implements 추상클래스, 클래스 상속시 extends라는 말을 들었다. 다트에서는 with, mixin등 다양한 키워드가 함께 있고 헷갈려 관련 내용을 정리한다.

Extends

클래스의 멤버변수, 함수, 생성자 등을 구현없이 사용할때 사용

Implements

클래스의 멤버변수, 함수, 생성자 등의 구현이 필수적

With (Mixins)

다양한 계층의 클래스에서 클래스의 코드를 재사용
ex> 동물 클래스의 까마귀 물고기 호랑이 클래스가 있다고 하면 각각 날고 걷고 수영하는 행동(메소드)를 가지는데 이러한 동일한 메소드들을 재사용 하기 위해 사용한다.

  1. 예제
// 정의
class Walker {
	
    void walk() {
    	print("walking");	
    }
}
// 확장 막기(인스턴스화, 확장 되지않도록함)
abstract class Walker {
	
    factory Walker._() => null;
    void walk() {
    	print("walking");	
    }
}
class A extends Walker{} // X

class Flyer {
	
    void fly(){
    	print('flying');
    }
}
class Mammal {}

class Bird {}

class Cat extends Mammal with Walker {}

class Dove extends Bird with Walker, Flyer {}

main(List<String> args) {
	Cat cat = Cat();
    Dove dove = Dove();
    
    cat.walk();
    dove.walk();
    dove.fly();
    
}

on

on 키워드를 사용하려면 mixin 키워드를 사용해서 믹스인을 선언해야 합니다.

예제
class A {}

mixin X on A {}

// Error
class Y on A {} 

class P extends A with X {}

// Error
class Q extends X {} 
디테일 예제
class A {
	String getMessage() => 'A';
}
class B {
	String getMessage() => 'B';
}
class P {
	String getMessage() => 'P';
}

class AB extends P with A,B {}

class BA extends P with B,A {}

main(List<String> args) {
	
    String result = '';
    
    AB ab = ÅB();
    result += ab.getMessage();
    
    BA ba = BA();
    result += ba.getMessage();
    
    print(result); // BA
}

타입
main(List<String> args) {
	
    String result = '';
    
    AB ab = AB();
    
    print(ab is P);	// true
    print(ab is A);	// true
    print(ab is B);	// true
    
    BA ba = BA();
    
    print(ba is P);	// true
    print(ba is A);	// true
    print(ba is B);	// true
}
언제 사용해야 하는가?

여러 클래스에서 동작을 공유할때

동물예제 완성
abstract class Animal {}

abstract class Mammal extends Animal {}

abstract class Bird extends Animal {}

abstract class Fish extends Animal {}

abstract class Walker {
	factory Walker._() => null;
    
    void walk() {
    	print('I'm walking');
    }
}

abstract class Swimmer {
	factory Swimmer._() => null;
    
    void swim() {
    	print('I'm swimming');
    }
}


abstract class Flyer {
	
    factory Flyer._() => null
    
    void fly(){
    	print('I'm flying');
    }
}

class Dolphin extends Mammal with Swimmer {}

class Bat extends Mammal with Walker, Flyer {}

class Cat extends Mammal with Walker {}

class Dove extends Bird with Walker, Flyer {}

class Duck extends Bird with Walker, Swimmer, Flyer {}
mixin vs class

mixin win

class Walker {
	
    void walk(){
    	print("i'm walking");
    }
}

class Walker2 {
	
    void walk(){
    	print("i'm walking, too");
    }
}

main(List<String> args) {
	
    Alpaca alpaca = Alpaca();
    alpaca.walk(); // i'm walking, too
}
override vs mixin

mixin win

class Walker2 {
	
    void walk() {
    	print("I'm walking, too");
    }
}

abstract class IWalker {
	void walk();
}

// 오버라이드 안해도 됨
class Lama extends IWalker with Walker2 {}
profile
2021.05.03) Flutter, BlockChain, Sports, StartUp

0개의 댓글