2016-11-22 16 views
2

이 (오히려 지루한) 코드 고려해 놀랍게도동적 파견 및 스위프트의 프로토콜

class SCell : NSObject {} 
class SHeader : NSObject {} 

class Cell : SCell {} 
class Header : SHeader {} 
struct Model {} 

protocol PA { 
    typealias Ce = SCell 
    typealias He = SHeader 
    func doThis(cell : PA.Ce,header : PA.He) 
} 

extension PA { 
    func doThis(cell : PA.Ce,header : PA.He) { 
     print("A's implementation") 
    } 
} 

protocol PB:PA { 

} 

extension PB { 
    func doThis(cell : PA.Ce,header : PA.He) { 
     print("B's implementation") 
    } 
} 

class A : PA { 
    func doSomethingElse() { 
     self.doThis(cell: Cell(), header: Header()) 
    } 
} 

class B : A,PB { 

} 

class C : B {} 

let c = C() 
c.doSomethingElse() 

, 이것은

"A의 구현"

내가했다

을 인쇄 시작을 doThis(cell:header)부터 "B의 구현"을 인쇄하려면 PB 기본 구현의 일부로 재정의됩니다. 이것은 놀랍게도 일어나지 않았습니다.

class B: A,PB { 
    override func doSomethingElse() { 
     self.doThis(cell: Cell(), header: Header()) 
    } 
} 

그것은 B의 구현

왜 이런 일이

인쇄하기 시작 : 더 흥미로운 무엇

나는이 작업을 수행하는 경우이다?

답변

1

프로토콜 확장은 다형성을 수행하지 않으므로이 경우에는 필요하지 않으면 동적으로 전달되지 않습니다. 이유는 프로토콜이 클래스, 구조체 및 열거 형에 의해 채택 될 수 있기 때문입니다.

또 다른 이유는 PA에서 프로토콜에 대한 기본 구현을 제공하고, 그래서 방법이없는 경우 PB은 (아직 에 정의되어 있기 때문에 PA되지 않은)을 적용하는 것입니다 .

자세한 내용은 here을 참조하십시오.

+0

다형성 부분을 수행하지 않는 프로토콜 확장에 대해서는 확신하지만, 그 이유에 대해서는별로 중요하지 않습니다. Sealos. 클래스에 대해서만 확인하도록 프로토콜 유형을 제한하면 여전히 동일한 동작을 보입니다. 내가 빠뜨린 스위프트에는 근본적인 것이 있습니다. 링크는 func이 요구 사항으로 선언 될 때와 그렇지 않을 때의 전달 속성의 차이점에 대해 설명합니다. 내 경우에 나타난 행동에 대해서는 아무 것도. – avismara

+0

C에서 doSomethingElse를 호출하려는 경우 부모 메소드를 호출합니다 (A에서 상속). A에서 사용 가능한 유일한 정보는 A가 PA를 따르고 PA 구현을 사용한다는 것입니다. PB doThis를 C..doSomethingElse() -> PA 구현에서 직접 호출하면 얻을 수 있습니다. c.doThis() -> PB – Sealos

+0

예, 그게 중요한 부분입니다. 여기에는 동적 디스패치가 없습니다. 벌금. 놀랍지 만, 왜 그런 일이 일어나지 않는지 알고 싶습니다. 언어 설계자에게 설계 결정을 내 렸습니다. 나는 모든 종류의 프로토콜을 준수 할 수있는 프로토콜 때문이 아니라는 사실을 알고 있습니다. – avismara