필자는 필수 (저장된 속성, 이니셜 라이저) 만 클래스 정의에 넣고 다른 모든 것을 그룹으로 묶을 논리적 블록 extension
과 같은 자체로 옮기는 경향이 있습니다.extension
// MARK:
예를 들어 UIView 하위 클래스의 경우 레이아웃 관련 항목, 이벤트 구독 및 처리 등을위한 확장으로 끝납니다. 이 확장에서는 필연적으로 일부 UIKit 메서드를 재정의해야합니다 (예 :) layoutSubviews
. 나는 오늘까지이 접근법에 어떤 문제도 발견하지 못했다
이 클래스 계층 구조를 예로 들어 보겠습니다.
public class C: NSObject {
public func method() { print("C") }
}
public class B: C {
}
extension B {
override public func method() { print("B") }
}
public class A: B {
}
extension A {
override public func method() { print("A") }
}
(A() as A).method()
(A() as B).method()
(A() as C).method()
출력은 A B C
입니다. 그것은 나에게 의미가 없습니다. 프로토콜 확장이 정적으로 전달되는 것에 대해 읽었지만 이것은 프로토콜이 아닙니다. 이것은 일반 클래스이며 런타임에 메소드 호출이 동적으로 전달 될 것으로 예상됩니다. 분명히 호출은 C
동적으로 전달되고 생성되어야 C
합니까?
상속을 제거하고 루트 클래스를 NSObject
만들면 C
컴파일러 declarations in extensions cannot override yet
는에 대해 이미 불평 합니다. 그러나 NSObject
루트 클래스로서의 일이 어떻게 변화합니까?
자신의 클래스 선언에 모두 재정의를 이동하면 생산 A A A
이 예상대로 만 이동하는 B
'생산에요 A B B
단지 이동 A
의가 생산' C B C
조차 하나가 정적에 입력 :, 그 중 마지막은 나에게 전혀 의미가 없습니다 A
생산 A
-output 더 이상!
dynamic
정의 또는 재정의에 키워드를 추가해도 '클래스 계층 구조의 해당 시점부터 아래쪽으로'원하는 동작을 제공하는 것 같습니다 ...
예제를 조금 덜 구성한 것으로 변경해 보자. 실제로이 질문을 게시하게했다 :
public class B: UIView {
}
extension B {
override public func layoutSubviews() { print("B") }
}
public class A: B {
}
extension A {
override public func layoutSubviews() { print("A") }
}
(A() as A).layoutSubviews()
(A() as B).layoutSubviews()
(A() as UIView).layoutSubviews()
우리는 지금 얻는다 A B A
. 여기서는 UIView의 layoutSubviews를 동적으로 만들 수 없습니다.
두 재정의를 클래스 선언으로 옮기면 A A A
다시 우리를 얻습니다 .A 또는 B 만 여전히 우리를 얻습니다 A B A
. dynamic
다시 내 문제를 해결합니다.
이론적으로는 내가 한 dynamic
모든 일에 추가 할 수 override
는 있지만 여기서 다른 일을하고있는 것처럼 느낍니다.
extension
내가하는 것처럼 그룹화 코드에 s 를 사용하는 것이 실제로 잘못 되었습니까?