실험 샘플 코드
//声明一个协议
protocol SharedString {
func methodForOverride() -> Void
func methodWithoutOverride() -> Void
}
//扩展协议,实现默认实现
//注意方法methodWithoutOverride 中调用了 methodForOverride 方法,这里有一个上写文切换的问题
extension SharedString {
func methodForOverride() -> Void {
print("��")
}
func methodWithoutOverride() -> Void {
print("��")
methodForOverride()
print("��")
}
}
//在String类的扩展中遵守并实现协议
extension String:SharedString {
func methodForOverride() -> Void {
print(self)
}
}
//创建字符串并切换上下文到SharedString协议
let Shared:SharedString = "hello"
Shared.methodForOverride()
Shared.methodWithoutOverride()
수득 다른 부호 변환의 실행은 요약
사건 번호 | 계약 문 방법 | 기본 구현에서 프로토콜 확장 | 프로토콜 수준의 재 작성에 따라 | 실험 프로토콜의 특성에 따라 (스위치 컨텍스트) | 메소드 실행 방법의 결과 |
---|---|---|---|---|---|
1 | 예 | 아니 | 예 | 아니 | 오버라이드 (override) 프로토콜 수준의 방법에 따라 |
이 | 예 | 예 | 예 | 예 | 오버라이드 (override) 프로토콜 수준의 방법에 따라 |
삼 | 예 | 아니 | 예 | 예 | 오버라이드 (override) 프로토콜 수준의 방법에 따라 |
4 | 아니 | 아니 | 예 | 아니 | 오버라이드 (override) 프로토콜 수준의 방법에 따라 |
5 | 예 | 예 | 예 | 아니 | 오버라이드 (override) 프로토콜 수준의 방법에 따라 |
6 | 아니 | 예 | 아니 | 예 | 기본 확장 프로토콜 구현 |
(7) | 아니 | 예 | 아니 | 아니 | 기본 확장 프로토콜 구현 |
8 | 예 | 예 | 아니 | 예 | 기본 확장 프로토콜 구현 |
9 | 예 | 예 | 아니 | 아니 | 기본 확장 프로토콜 구현 |
(10) | 아니 | 예 | 예 | 예 | 기본 확장 프로토콜 구현 |
(11) | 아니 | 예 | 예 | 아니 | 도 1 및도 2는 프로토콜을 확장하는 방법이다. , 메소드 호출을 따라 클래스에서 재정의하는 방법은 방법은 프로토콜 클래스는 다시 작성 다음과 같습니다. 방법 2 다시 작성되지 않지만, 호출 방법 1 방법 2는 계약이라고 Tier 2 방법,이 시간에 아직 기본 프로토콜의 확장을 달성하기 위해 |
(12) | 아니 | 아니 | 예 | 예 | 오류 |
(13) | 아니 | 아니 | 아니 | 예 | 오류 |
(14) | 아니 | 아니 | 아니 | 아니 | 오류 |
(15) | 예 | 아니 | 아니 | 아니 | 오류 |
(16) | 예 | 아니 | 아니 | 예 | 목표 전환 |
기존 방법의 정적 특성을 유지하기 위해 상기 프로토콜 정보에 정의 된 프로토콜 정보를 재 기입하는 방법이 카트리지의 버전을 재기록하면 불변성을 보장 할 수있는 방법을 재기록하지 않으면 서, 문맥 전환하여 다른 버전을 획득 할 수있다.
우리는 그렇지 않은 사람들 정의 및 프로토콜 확장에 복제 메소드를 구현하고자하는 계약에 정의 방법 오버라이드 (override) 할 수 원하는 사람들에게 원칙을 따를 수 있습니다.