Skip to content

Latest commit

 

History

History
145 lines (117 loc) · 3.53 KB

protocol vs abstract interface class.md

File metadata and controls

145 lines (117 loc) · 3.53 KB

protocol vs abstract interface

1. 기본사용

swift

protocol HeaderViewProtocol {
    var contents: Content { get set }
    func configureView(data: Content)
    func configureLayout()
}

final class HeaderView: HeaderViewProtocol {
    var contents: Content
    
    init(contents: Content) {
        self.contents = contents
    }
    
    func configureView(data: Content) {
        print("데이터 컨피규어되었어.")
    }
    
    func configureLayout() {
        print("레이아웃도 정상적용되었어")
    }
}

dart

abstract interface class HeaderViewInterface {
  Content get content;
  set content(Content content);
  configureView(Content content);
  configureLayout();
}

class HeaderView implements HeaderViewInterface {
  @override
  Content content;

  HeaderView(this.content);
  
  @override
  configureView(Content content) {
    print('데이터 컨피규어되었어');
  }

  @override
  configureLayout() {
    print('레이아웃도 정상적용되었어');
  }
}
  • 기본적으로 둘 다 청사진으로서의 역할 자체는 동일하게보인다.

2. extension 사전구현 가능 여부

swift (가능)

extension HeaderViewProtocol {
    func configureView(data: Content) {
        print("익스텐션에서 다 구현해보림 ㅎㅎ")
    }
    
    func configureLayout() {
        print("나두 익스텐션에서 다 해버림")
    }
}

final class HeaderView: HeaderViewProtocol {
    var contents: Content
    
    init(contents: Content) {
        self.contents = contents
    }
}
  • 이 기능은 HeaderView1, HeaderView2, HeaderView3 ... 등 이들이 HedaerViewPorotocol을 모두 채택한다면
  • 각각 구현 해주는 건 귀찮기에 extension을 활용하여 한번에 프로토콜 extension에서 공통구현해주는 기능이다.

dart (불가능)

extension HeaderViewInterfaceExtension on HeaderViewInterface {
  configureView(Content content) {
    print("익스텐션에서 다 구현해보림 ㅎㅎ");
  }

  configureLayout() {
    print("나두 익스텐션에서 다 해버림");
  }
}

class HeaderView implements HeaderViewInterface {
  @override
  Content content;

  HeaderView(this.content);
}

// Missing concrete implementations of 'HeaderViewInterface.configureLayout' and 'HeaderViewInterface.configureView'.

  • 근데 사전구현을 하는 뭔가 다른 방법이 있어보인다.
  • 아직 그까지는 진도를 나가지않아서.. 잘 몰게따

3. 타입으로 선언하기

Swift (가능)

let headerView: HeaderViewProtocol = HeaderView(contents: Content())

func something(headerView: HeaderViewProtocol) -> HeaderViewProtocol {
    return HeaderView(contents: Content())
}

Dart (가능)

final HeaderViewInterface headerView = HeaderView(Content());

HeaderViewInterface something(HeaderViewInterface headerView) {
  return HeaderView(Content());
}
  • 둘 다 사용가능하다.
  • 이 부분을 심화하면 생성자에서 인터페이스를 implement하는 타입을 설정하여 다양한 활용이 가능할 것 같다.(mock 객체 활용 등)

4. 다중상속

Swift (가능)

protocol Aprotocol {}
protocol Bprotocol {}
protocol Cprotocol {}

class Star: Aprotocol, Bprotocol, Cprotocol {}

Dart (가능)

abstract interface class Ainterface{ }
abstract interface class Binterface{ }
abstract interface class Cinterface{ }

class Star implements Ainterface, Binterface, Cinterface {}
  • 이정도면 거의 동일한 개념과 특성이라고 봐도 좋을 듯하다.