ฉันมักจะใส่เฉพาะความจำเป็น (คุณสมบัติที่เก็บไว้, ตัวเริ่มต้น) ลงในคำจำกัดความของคลาสของฉันและย้ายทุกสิ่งทุกอย่างไปเป็นของตัวเอง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. ที่ไม่ค่อยมีเหตุผลสำหรับฉัน ฉันอ่านเกี่ยวกับ Protocol Extensions ที่ถูกส่งแบบคงที่ แต่นี่ไม่ใช่โปรโตคอล นี่เป็นคลาสปกติและฉันคาดว่าการเรียกเมธอดจะถูกส่งแบบไดนามิกที่รันไทม์ เห็นได้ชัดว่าการโทรCอย่างน้อยควรมีการส่งและผลิตแบบไดนามิกCหรือไม่?
ถ้าฉันลบการสืบทอดNSObjectและสร้างCคลาสรูทคอมไพเลอร์จะบ่นว่าdeclarations in extensions cannot override yetซึ่งฉันได้อ่านไปแล้ว แต่การมีNSObjectคลาสรูทเปลี่ยนสิ่งต่าง ๆ อย่างไร?
การย้ายการลบล้างทั้งสองไปสู่การประกาศคลาสของพวกเขาก่อให้เกิดA A Aตามที่คาดไว้การย้ายเฉพาะการBผลิตการA B Bย้ายเพียงการAสร้างC B Cเท่านั้นซึ่งสุดท้ายก็ไม่สมเหตุสมผลสำหรับฉัน: แม้แต่การพิมพ์แบบคงที่เพื่อAสร้างAเอาต์พุตอีกต่อไป!
การเพิ่ม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ตอนนี้เราได้รับ ที่นี่ฉันไม่สามารถสร้าง layoutSubviews แบบไดนามิกของ UIView ได้ด้วยวิธีใด ๆ
ย้ายทั้งแทนที่เข้าสู่การประกาศคลาสของพวกเขาได้รับเราA A Aอีกครั้งเพียงเท่านั้นหรือ B A B Aยังคงได้รับเรา dynamicแก้ปัญหาของฉันได้อีกครั้ง
ตามทฤษฎีแล้วฉันสามารถเพิ่มdynamicทุกสิ่งoverrideที่ฉันเคยทำ แต่ฉันรู้สึกว่าฉันทำอะไรผิดพลาดที่นี่
การใช้extensions ในการจัดกลุ่มโค้ดอย่างที่ฉันทำผิดจริงๆหรือ?