필자는 필수 (저장된 속성, 이니셜 라이저) 만 클래스 정의에 넣고 다른 모든 것을 그룹으로 묶을 논리적 블록 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 를 사용하는 것이 실제로 잘못 되었습니까?