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의 구현
왜 이런 일이
인쇄하기 시작 : 더 흥미로운 무엇
나는이 작업을 수행하는 경우이다?
다형성 부분을 수행하지 않는 프로토콜 확장에 대해서는 확신하지만, 그 이유에 대해서는별로 중요하지 않습니다. Sealos. 클래스에 대해서만 확인하도록 프로토콜 유형을 제한하면 여전히 동일한 동작을 보입니다. 내가 빠뜨린 스위프트에는 근본적인 것이 있습니다. 링크는 func이 요구 사항으로 선언 될 때와 그렇지 않을 때의 전달 속성의 차이점에 대해 설명합니다. 내 경우에 나타난 행동에 대해서는 아무 것도. – avismara
C에서 doSomethingElse를 호출하려는 경우 부모 메소드를 호출합니다 (A에서 상속). A에서 사용 가능한 유일한 정보는 A가 PA를 따르고 PA 구현을 사용한다는 것입니다. PB doThis를 C..doSomethingElse() -> PA 구현에서 직접 호출하면 얻을 수 있습니다. c.doThis() -> PB – Sealos
예, 그게 중요한 부분입니다. 여기에는 동적 디스패치가 없습니다. 벌금. 놀랍지 만, 왜 그런 일이 일어나지 않는지 알고 싶습니다. 언어 설계자에게 설계 결정을 내 렸습니다. 나는 모든 종류의 프로토콜을 준수 할 수있는 프로토콜 때문이 아니라는 사실을 알고 있습니다. – avismara